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组合器的最后一个参数是应用操作的序列的原因.
原因是这样的
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个元素的不同参数顺序
是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)