FSharp函数参数的顺序

时间:2013-11-30 18:25:06

标签: f# functional-programming

由于具有多个参数的FSharp中的函数本身就是只有一个参数的函数,因此Seq.filter的签名必须是

Seq.filter predicate source

有多么不同
Seq.filter source predicate

由于

4 个答案:

答案 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个参数到更宽的签名。 :)