FSharp函数参数的顺序

Pra*_*Rao 4 f# functional-programming

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

Seq.filter predicate source
Run Code Online (Sandbox Code Playgroud)

?它会有多么不同

Seq.filter source predicate
Run Code Online (Sandbox Code Playgroud)

谢谢

Fra*_*ank 10

第一个顺序(谓词,序列)更适合通过|>运算符链接序列组合子.通常,您有一个序列可以应用多个操作/转换,请考虑类似的事情

xs |> Seq.map ... |> Seq.filter ... |> Seq. ...
Run Code Online (Sandbox Code Playgroud)

将参数的顺序颠倒到(源,谓词)将会禁止(或至少使表达更加尴尬).那(也可能是部分应用)是(几乎)所有默认Seq组合器的最后一个参数是应用操作的序列的原因.


Guy*_*der 6

原因是这样的

Seq.filter predicate source 
Run Code Online (Sandbox Code Playgroud)

代替

Seq.filter soure predicate 
Run Code Online (Sandbox Code Playgroud)

这样你就可以做到这一点

source
|> Seq.filter predicate
Run Code Online (Sandbox Code Playgroud)

因为您更有可能使用构建新函数 Seq.filter predicate

let isEven = Seq.filter (fun x -> x % 2 = 0)
Run Code Online (Sandbox Code Playgroud)

你现在可以做

source |> isEven
Run Code Online (Sandbox Code Playgroud)

F#中有一些函数,其中参数的顺序不是这样的,因为它来自OCaml的历史.请参阅:获取Array,List或Seq的第N个元素的不同参数顺序


Lee*_*Lee 5

Seq.filter采用谓词后跟序列进行过滤.如果您想以其他顺序提供它们,您可以编写一个函数来反转参数:

let flip f a b = f b a
Run Code Online (Sandbox Code Playgroud)

然后你可以写

(flip Seq.filter) [1..10] (fun i -> i > 3)
Run Code Online (Sandbox Code Playgroud)

现有的订单更方便,因为它使部分应用更有用,例如

 [1..3] |> Seq.map ((*)2) |> Seq.filter (fun i -> i > 2)
Run Code Online (Sandbox Code Playgroud)