2012-12-07 32 views
28

很酷的新F#3.0功能类型提供者可以用来弥补F#数据类型或类与数据源结构(如XML或WSDL)之间的不匹配。然而,这种不匹配在C#等其他.NET语言中也是一个挑战。F#类型提供者是否可以并入C#

我想在C#代码中使用F#3.0提供程序。我怎么能这样做,如果有的话?此外,如果我们不能,那么C#实现需要能够使用它们呢?

+1

这应该是社区wiki的形式。我相信这会引发相当长的讨论。 –

回答

9

类型提供程序如何工作的某些方面特别适合F#程序员的需求,但在考虑解决其他语言的强类型数据访问时可能不那么引人注目。例如,很多F#编程都是在F#Interactive中完成的,与代码生成器(需要用于生成源代码文件的语言外部机制)相比,类型提供程序能够非常好地实现此工作流程。由于C#程序员习惯于慢编辑 - 编译运行周期,所以在C#设置中这可能不那么重要。从技术角度来看,我怀疑F#的更普遍类型推断可能是与C#等语言相比最大的优势。举例来说,如果我想从另一个类型的类型提供换一些数据访问逻辑,我可以做这样的事情:

let moviesStartingWith prefix = 
    query { 
     for movie in MyDataSource.Movies do 
     where (movie.Title.StartsWith(prefix) } 
    |> Seq.toList 

在C#中,我需要指定返回类型(例如List<DataSource.ServiceTypes.Movie>)这最终是一件杂事,这意味着即使使用IntelliSense,我也会点击提供的一组类型来生成签名,除了点击提供的值来生成查询外。

当然,这也适用于类型提供者以外的领域,但我认为,对于某些提供者自然生成的某些嵌套类型层次结构,这在实践中会特别痛苦,因为类型名称变为非常长。

+2

C#类型推断可能会比你给的功劳更好。即使这是一种方法而不是内联语句,人们可以在方法签名上放置一个类型参数,并且在MyDataSource.Movies中传递的行为将绑定类型参数,而不需要指定关闭的类型,返回类型'列表'。 – codekaizen

24

我认为@kvb很好地概括了一些技术难点。我同意类型推断会有问题 - 您将基本上局限于在本地使用提供程序生成的类型,类似于匿名类型。我认为C#可能出现在罗斯林类似的东西,但我怀疑这将是优雅和顺利地集成是在F#(其中类型供应商实际上是语言功能并不仅仅是工具)。

要回答你的两个具体的问题:

[我怎么能]使用F#3.0中提供的C#代码?

F#类型的提供者实际上只被F#编译器理解,所以你需要从F#中使用它们。对于生成的类型提供程序(SQL,实体,WSDL,配置文件),您可以引用来自F#的提供程序并使用C#项目中生成的类型。

对于删除类型提供程序,您将无法执行此操作,因为类型并不存在,只有F#可以看到它们。所以最好的选择是在F#中编写处理代码,并将结果作为记录或其他类型的集合返回,这些记录或其他类型很容易从C#中使用。

C#实现需要什么才能使用它们?

我当然可以说“C#将不得不支持类型提供者!”,但这里有更多的想法。类型提供者只是.NET程序集,他们不使用任何F#特定类型。 ITypeProvider interface可以被任何.NET语言(包括C#)使用,所以如果C#设计人员想要,他们可以重用已经为F#构建的所有优秀提供程序。

因此,将此建议提交给C# user voice或在其他地方倡导(或者说服Mono团队实施此操作!),并且可能会将其添加到C#中(vNext + 1 + ...)。目前,您只能在F#中获得所有优势。

+0

感谢您的好评。我不确定我是否完全理解生成类型和擦除类型提供者之间的区别。我在哪里可以找到有关此主题的其他信息?我想世界银行类型的提供者是一个擦除类型提供者的例子。但是,如何一个CSV类型的提供者。它也是一个擦除类型的提供者? – carstenj

+0

“所以最好的选择是在F#中编写处理代码,并将结果作为记录或其他类型的集合返回,这些记录或其他类型很容易从C#中使用。”你有这样的代码示例吗? –

+0

@无名我对此做了一个Pluralsight视频:https://www.pluralsight.com/courses/accessing-data-fsharp-type-providers它实际上在未来2天内免费提供(但你应该以后也能获得免费试用)。 –

相关问题