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