f# - 通过类型提供者创建通用类型

标签 f# type-providers

是否可以通过类型提供程序创建泛型类型,以便

[<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/

相关文章:

f# - 为什么 Akka.Net F# API 定义了 actorOf2 而不是 actorOf3、actorOf4 等?

visual-studio-code - 在 F# 交互窗口中显示完整字符串

Excel 类型提供程序有错误 - 它需要程序集 "Excel.dll"

f# - FSharp.Data.JsonProvider - 从类型中获取 json

f# - 在 .NET Core 2.1 中使用 F# (FSharp.Core 4.3.4) 类型提供程序

f# - 将 F# 3.0 中的 Amazon WSDL Web 服务与类型提供程序结合使用

f# - 在 F# 中将 MailboxProcessor 包装到 IObservable 中的好方法是什么?

f# - 需要有关异步和 fsi 的帮助

F# 类型为 `and` 和 Lazy?

f# - 我什么时候需要调用 "ConvertToGenerated"成员来使用类型提供程序生成类型