2016-10-26 4 views
5

Можно ли создать общий тип, так чтоСоздание универсальных типов с помощью провайдеров типа

[<TypeProvider>] 
type SampleTypeProvider(config: TypeProviderConfig) as this = 

... 
//the below would be the generated type 
type A<'b>() = 
    member this.C() : 'b = ... 
    member this.D() : 'b = ... 
// 
... 
[<assembly:TypeProviderAssembly>] 
do() 
    .... 

так, что в случае использования будет выглядеть на

#r @".\bin\Debug\SampleTypeProvider.dll" 
type A = SampleTypeProvider.A 
type intA = A<int> 
type strA = A<str> 

через провайдеров типа А если это возможно - как я могу подойти к нему.

ответ

4

Это невозможно, используя стандартные методы. Я попытался оглянуться, но не смог найти каноническую ссылку, но это известное ограничение, и были разные предложения по снятию ограничения.

Росс McKinlay имеет несколько экстремальный проект под названием Mixin type provider, который работает вокруг этого, фактически создавая файл с исходным кодом F # при запуске оператора типа (и затем вы можете включить этот файл в свой проект). Это, пожалуй, больше генерации кода, чем поставщик типов, но его talk about the topic также является хорошим объяснением некоторых ограничений.

Как это решить очень сильно зависит от цели поставщика. Если вам нужно только ограниченное количество типов, вы можете использовать что-то вроде статических параметров и написать A<"int"> или A<"string">. Вы также можете смешивать обычные не предоставляемые общие типы с не-генерическими типами (в некотором смысле). Но я думаю, вам нужно больше написать о вашем конкретном случае использования, чтобы получить лучший ответ.

+0

вздох. Я надеялся на другой ответ, которого я ожидал от того, кого вы дали. – robkuz

 Смежные вопросы

  • Нет связанных вопросов^_^