为什么.NET LINQ方法在F#核心库中重写?

时间:2014-11-16 22:25:55

标签: c# linq f#

我在github上看到F#核心库有一组重写的LINQ方法。这是什么原因?为什么它们与C#方法不同?

修改

我不确定与此有什么意见,但也许是为什么它们重复以及为什么它们略有不同的问题应该分开。一个例子是使用take方法:在C#中,调用4个元素序列中的5个元素将返回该4个元素的序列,而在F#中它将引发异常。

1 个答案:

答案 0 :(得分:9)

Seq模块包含与LINQ类似的功能有几个原因:

  • F#首先使用它: - )在将LINQ添加到C#之前很久就存在F#中的Seq模块。我猜C#团队可能已经决定只使用Seq模块作为LINQ的实现,但不难看出为什么没有发生......

  • C#使用扩展方法,而F#使用函数 - 原则上,F#函数被编译为静态方法,因此不可能想象它们可以被标记为可访问的扩展方法来自C# - 但这并不简单。

  • F#函数是curry - 这很棘手 - 在C#中,this IEnumerable<T>参数通常是第一个,而在F#中它是最后一个(允许部分)功能应用)

  • F#函数采用FSharpFuncFunc - 另一个技术差异 - F#函数编译方式不同(出于性能原因)

  • 命名也不同。对于F#,这对于保持部分OCaml兼容性非常重要。