F# 匿名函数,流水线
F# anonymous functions, pipelining
我从 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
的 |>
运算符有两个参数 f
和 x
。然后它将 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
采用函数 f
和 g
并生成一个新函数 (fun x -> g (f x))
接受输入,将其传递给 f
然后将结果传递给 g
.
我从 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
的 |>
运算符有两个参数 f
和 x
。然后它将 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
采用函数 f
和 g
并生成一个新函数 (fun x -> g (f x))
接受输入,将其传递给 f
然后将结果传递给 g
.