为什么Collections.Seq
模块有很多方法看起来等同于声明的扩展方法System.Linq.Enumerable
?为什么 F# 的设计者觉得需要为所有这些创建一个新的命名空间和新的/不同的名称,而不是重用 .NET 中已经存在的东西?
(如果他们需要一些额外的方法,为什么不直接将它们添加到System.Linq.Enumerable
?)
为什么Collections.Seq
模块有很多方法看起来等同于声明的扩展方法System.Linq.Enumerable
?为什么 F# 的设计者觉得需要为所有这些创建一个新的命名空间和新的/不同的名称,而不是重用 .NET 中已经存在的东西?
(如果他们需要一些额外的方法,为什么不直接将它们添加到System.Linq.Enumerable
?)
这里还有其他一些不错的答案,但我的看法很简短
基本上,一旦您习惯了 F# 习惯用法,您就会发现 .NET API 有点不适合 F# 风格的编程。F# 主要面向流水线式编程(需要部分应用传入序列作为最后一个柯里化参数)和类型推断(与重载交互不良)。
所以 F# 有自己的库,可以很好地与 F# 配合使用。(这是一个快速解码器环博客。)
因为 LINQ 方法位于 System.Core => 仅适用于 .NET 3.5 及更高版本,并且 F# 基础库支持 .NET 2.0+。
Seq 函数的附加使用风格(通过管道)对于 LINQ 可枚举扩展的点风格的 F# 代码更自然。
另一个原因是在 F# 中使用管道运算符(|>、<|、>>)。
.NET 扩展方法基本上是为第一个参数提供部分应用。F# 流水线操作符部分适用于最后一个参数。Seq 模块中的所有函数都将序列作为最后一个参数。
C#
seq.Where(...)
.Select(...)
.Take(...)
F#
seq
|> Seq.filter ...
|> Seq.map ...
|> Seq.take ...