如何通过更高阶函数创建函数?

时间:2014-09-11 03:24:27

标签: f# functional-programming

我正在经历更高阶函数的定义。根据定义,高阶函数可以取值或函数,并创建函数或值作为输出。我正在阅读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是一个高阶函数,它又创建一个函数作为输出?如果是的话,有人不会向我展示一个函数生成函数的简单示例吗?

2 个答案:

答案 0 :(得分:4)

最简单的例子就是一个curried函数。

let multiply (a : int) (b : int) : int = a * b
例如,

。 只要写下它的签名就可以了

int -> int -> int 

真的是

int -> (int -> int)

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

multiply 5 == fun b -> 5 * b

正如你所看到的那样,当你使用curried函数时,高阶函数在函数式编程/ F#中都存在。

另一方面的例子可以改写为:

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

所以这是一个高阶函数,因为它需要一个函数(f),但它没有返回一个 - 顾名思义它将5传递给你调用的每个函数它(另一个常见名称可能是 apply 5)。

答案 1 :(得分:2)

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

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

运营商的类型是('a -> 'b) -> ('b -> 'c) -> ('a -> 'c);在这种情况下,所有类型变量都是int,因为操作数都是int -> int,结果也是如此。