F# 匿名函数,流水线

问题描述

我从我的 f# 课程开始就试图理解 lambda 函数,但有时仍然难以阅读和使用它们。

let wordCount = "aaa aaa".Split [| ' ' |]
wordCount.Length // 2
let letterCount = wordCount |> Array.sumBy (fun w -> w.Length) 

我对上面几行的理解:前两个很简单,第三个是我不明白的。由于 wordCount 是字符串数组 [|"aaa"; "aaa"|]Array.sumBy (fun w -> w.Length) 如何知道数组作为参数传递而 (fun w -> w.Length) 正常工作。 sumBy 是否只是对数组的每个元素执行 anon 函数?这在 .map 和其他此类方法上是否相同?

还有一个小问题,顺便说一下>>和|>的区别?

解决方法

用作 |>x |> f 运算符采用两个参数 fx。然后将 x 作为参数传递给 f,即调用 f x

这意味着:wordCount |> Array.sumBy (fun w -> w.Length)
等同于:Array.sumBy (fun w -> w.Length) wordCount

现在,Array.sumBy f input 是一个函数,它将 f 应用于输入数组 input 中的所有项目,并对各个元素返回的数字求和。

所以,如果您有:Array.sumBy (fun w -> w.Lenght) [| "aa"; "b" |]
这与((fun w -> w.Lenght) "aa") + ((fun w -> w.Lenght) "b")
相同 就是:"aa".Length + "b".Length 就是 3

函数组合运算符 f >> g 接受一个函数 fg,它产生一个接受输入的新函数 (fun x -> g (f x)),将其传递给 f然后将结果传递给 g