【问题标题】:How would one create a function as a result of a higher order function?作为高阶函数的结果,如何创建一个函数?
【发布时间】:2014-11-04 21:02:11
【问题描述】:

我正在讨论高阶函数的定义。根据定义,高阶函数可以取值或函数并创建函数或值作为输出。我正在阅读 F# 和 Erlang 的书,到目前为止,我还没有找到一个函数创建函数作为结果的书,或者我已经看到它没有作为结果函数出现在我面前。我理解一个将函数作为输入的函数(如 C# 中的 Action 或 Func) 这是基于 wikibook on F#

的示例代码
open System

let square x = x * x    

let cube x = x * x * x

let sign x =
    if x > 0 then "positive"
    else if x < 0 then "negative"
    else "zero"

let passFive f = (f 5)

在这个例子中,passFile 是一个高阶函数,它反过来创建一个函数作为输出?如果是的话,谁能给我一个简单的例子,函数生成一个函数作为结果?

【问题讨论】:

    标签: f# functional-programming


    【解决方案1】:

    最简单的例子就是一个柯里化函数。

    let multiply (a : int) (b : int) : int = a * b
    

    例如。 只要写下它的签名,你就有了类似的东西

    int -> int -> int 
    

    这是真的

    int -> (int -> int)
    

    所以这一个接受一个整数 (a) 并返回另一个函数的函数:

    multiply 5 == fun b -> 5 * b
    

    正如您所见,当您使用柯里化函数时,函数式编程/F# 中到处都是高阶函数。

    你在另一边的例子可以改写为:

    let passFive (f : int -> 'b) : 'b = f 5
    

    所以这是一个高阶函数,它接受一个函数 (f) 但它不返回一个函数 - 顾名思义,它将5 传递给您调用它的每个函数(另一个通用名称可能是 apply 5).

    【讨论】:

      【解决方案2】:

      另一个例子是组合运算符(&gt;&gt;)(&lt;&lt;)。它们采用两个函数并将它们组合成一个函数。例如:

      let twoNPlusOne = (*) 2 >> (+) 1
      

      运算符的类型是('a -&gt; 'b) -&gt; ('b -&gt; 'c) -&gt; ('a -&gt; 'c);在这种情况下,所有类型变量都是int,因为操作数都是int -&gt; int,结果也是。

      【讨论】:

      • 是的 +1(有很多这样的) - 当然,运算符本身是一个柯里化函数 (&gt;&gt;) : ('a -&gt; 'b) -&gt; ('b -&gt; 'c) -&gt; 'a -&gt; 'c) :D
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-15
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多