【问题标题】:F# anonymous functions, pipeliningF# 匿名函数,流水线
【发布时间】:2021-06-15 20:25:58
【问题描述】:

我从我的 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 和其他此类方法上是否相同?

还有一个小问题,顺便说一句>>和|>?

【问题讨论】:

  • 这个东西可以工作,因为 F# 支持柯里化。您可以在FSharpForFunAndProfit 上阅读有关它的信息。我发现这个网站是新手学习 F# 知识的绝佳来源

标签: lambda f# anonymous-function pipelining


【解决方案1】:

|> 运算符,用作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,然后将结果传递给@987654342 @。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 2022-10-20
    相关资源
    最近更新 更多