由于FSharp中具有多个参数的函数本质上被柯里化为仅具有一个参数的函数,因此Seq.filter
的签名是否应该为
Seq.filter predicate source
它与当前有什么不同?
Seq.filter source predicate
谢谢
由于FSharp中具有多个参数的函数本质上被柯里化为仅具有一个参数的函数,因此Seq.filter
的签名是否应该为
Seq.filter predicate source
它与当前有什么不同?
Seq.filter source predicate
谢谢
第一个序列(谓词,顺序)更适合通过 |>
运算符链式组合序列组合器。通常情况下,您有一个单一的序列,对其应用多个操作/转换,考虑类似以下内容:
xs |> Seq.map ... |> Seq.filter ... |> Seq. ...
等等。如果将参数的顺序颠倒成(source,predicate),那么就会禁止这样做(或者至少使表达变得更加笨拙)。这也是为什么对于(几乎)所有默认的Seq
组合器,操作所应用的序列都是最后一个参数的原因,可能还有部分应用。
它之所以如此
Seq.filter predicate source
替换为
Seq.filter soure predicate
这样你就可以做到这一点。
source
|> Seq.filter predicate
由于您更有可能使用Seq.filter predicate
构建新功能
let isEven = Seq.filter (fun x -> x % 2 = 0)
现在你可以做到
source |> isEven
因为 F# 的历史渊源来自 OCaml,所以在某些函数中参数的顺序并不是像这样设定的。详情请参考:获取数组、列表或 Seq 中第 N 个元素的不同参数顺序
是的,Seq.filter
接受一个谓词和一个待过滤的序列作为参数。如果你想要以相反的顺序提供它们,你可以编写一个函数来颠倒参数:
let flip f a b = f b a
然后你可以写
(flip Seq.filter) [1..10] (fun i -> i > 3)
[1..3] |> Seq.map ((*)2) |> Seq.filter (fun i -> i > 2)