【问题标题】:Is it possible to use System.Type as static parameter in F# type provider?是否可以在 F# 类型提供程序中使用 System.Type 作为静态参数?
【发布时间】:2013-12-26 05:04:43
【问题描述】:

我想知道是否可以使用 System.Type 作为 F# 类型提供程序中的静态参数,以便我可以编写如下内容:

type HelperType = HelperProvider<typeof<int>>

想法是,是否可以让类型提供程序基于某些 .NET 类型生成一些帮助类型。

【问题讨论】:

  • 为什么不“键入 HelperType = HelperProvider”?我相信它在这方面与其他 .net 语言的工作方式相同。
  • @PhillipScottGivens 感谢您的回复,我做了测试,不行。我稍后再发布。
  • 这里是我添加的代码: let helperProvider = let ty = ProvidedTypeDefinition(thisAssembly, providedNamespace, "GPUHelperProvider", Some typeof, IsErased = false) let parameters = ProvidedStaticParameter("Namespaces", typeof) :: ProvidedStaticParameter("Test", typeof) :: [] ty.DefineStaticParameters(parameters, generateHelper) ty 然后在我使用的代码中:` [] let namespaces = "TestData .MyGPUTypes.Base;TestData.MyGPUTypes.Derived" type GPUHelper = Alea.TypeProviders.GPUHelperProvider
  • @PhillipScottGivens 嗯,不会写代码,那就给个简短的反馈吧。我用ProvidedStaticParameter("Test", typeof&lt;Type&gt;),然后我用Provider&lt;int&gt;,错误是:Script.fsx(12,67): error FS0001: This expression is expected to have type System.Type but here has type 'a -> int

标签: f# type-providers


【解决方案1】:

不,类型提供程序参数只能是原始类型(如intstring)。您可以做的最好的是将类型名称作为字符串:

type HelperType = HelperProvider<"int">

这对原始类型(和标准类型)有用,但不适用于在您使用类型提供程序的文件(或项目)中较早定义的类型。

据我所知,这绝对是 F# 团队一直在研究的东西——它将允许一些有趣的元编程应用程序。目前的主要关注点是数据访问,所以这并不是一个优先事项(出于好奇,您想到了什么应用程序?)

顺便说一句 - 将类型作为参数传递可能会引发一些有趣的棘手问题。例如,编译器将如何处理这样的事情:

type A = MyProvider<B>
and B = MyProvider<A>

【讨论】:

  • 感谢 Tomas,我想做的应用程序是从现有类型创建一个辅助类型。在 GPU 应用程序(使用 Alea.cuBase)中,我们希望在将数据发送到 GPU 内存之前对数据进行一些转置,因此如果我们可以根据现有类型生成一些辅助类型和方法会很好。好吧,我已经使用了另一种方法,将命名空间放入参数中,然后从 TypeProviderConfig.ReferencedAssemblies 加载程序集,如果您有兴趣,这里是源代码:github.com/soloman817/Alea.TypeProviders/blob/master/src/…
  • 是的,前向声明是一个问题。我还注意到在实现时我只能使用引用程序集中的类型,而不是调用类型提供程序之前定义的类型。
  • @TomasPetricek 您知道团队是否仍在考虑将类型作为参数传递给类型提供程序吗?用例是让类型提供者为 GUI 设计者生成代码隐藏
  • 给定一个记录类型Rec,我希望能够提供类型Partial&lt;typeof&lt;Rec&gt; &gt;,它与Rec具有相同的字段,除了它们都是可选的(或可选 可选,如果它们已经是可选的)。我会用它来表示可能不完整的数据集、每个成员可能为空或不为空的 JSON 类型等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多