由于具有多个参数的FSharp中的函数本身就是只有一个参数的函数,因此Seq.filter
的签名必须是
Seq.filter predicate source
?
有多么不同Seq.filter source predicate
由于
答案 0 :(得分:10)
第一个顺序(谓词,序列)更适合通过|>
运算符链接序列组合子。通常,您有一个序列可以应用多个操作/转换,请考虑类似
xs |> Seq.map ... |> Seq.filter ... |> Seq. ...
等。将参数的顺序颠倒到(源,谓词)会禁止(或者至少使表达更加尴尬)。那(也许也是部分应用)是(几乎)所有默认Seq
组合器的最后一个参数是操作应用的序列的原因。
答案 1 :(得分:6)
原因是
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的历史。请参阅:Different argument order for getting N-th element of Array, List or Seq
答案 2 :(得分:5)
是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)
答案 3 :(得分:0)
你也有||>用于管道功能接受两个参数签名,或部分应用2个参数到更宽的签名。 :)