是否可以通过类型提供程序创建泛型类型,以便
[<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>
如果这是可能的 - 我该如何实现它。
最佳答案
使用标准方法这是不可能的。我尝试环顾四周,但找不到规范的引用,但这是一个已知的限制,并且已经有各种建议来解除该限制。
Ross McKinlay 有一个有点极端的项目,名为 Mixin type provider通过在运行类型提供程序时实际生成带有 F# 源代码的文件来解决此问题(然后您可以将此文件包含在项目中)。这也许比类型提供者更多地是代码生成,但是他的talk about the topic也很好地解释了一些限制。
如何解决这个问题很大程度上取决于类型提供者的目的。如果您只需要有限数量的类型,您可以使用静态参数之类的东西并编写 A<"int">
或A<"string">
。您还可以将普通的未提供的泛型类型与非泛型提供的类型混合(以某种巧妙的方式)。但我认为您需要更多地了解您的具体用例才能获得更好的答案。
关于f# - 通过类型提供者创建通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40264601/