我在看书,Functional Programming Using F# , 其中 says (第 33 页),在高阶函数的声明部分
We have seen higher-order built-in functions like (+) and (<<)
并在本节末尾
Higher-order functions may alternatively be defined by supplying the arguments as follows in the let-declaration:
let weight ro s = ro * s ** 3.0;;
然而,在 question that I asked earlier today 的底部有一些有用的评论。 (最初的标题是“我什么时候应该将我的函数编写为高阶函数”)似乎对这些示例是否实际上是高阶函数提出了一些疑问。
wikipedia definition of higher-order function是:
a higher-order function (also functional form, functional or functor) is a function that does at least one of the following: (i) take one or more functions as an input; (ii) output a function.
一方面,我可以看到像
(+)
这样的函数。 , 和 weight
可能被视为高阶函数,因为给定一个参数,它们返回一个函数。另一方面,我可以看到它们被正确地视为柯里化(Currying)函数。我正在学习 F# 作为一个自学项目,并希望将概念弄清楚,因此本网站上的答案和讨论特别有帮助。我的问题是,这些函数的正确术语是什么,也许更重要的是,人们通常如何使用术语“高阶函数”和“柯里化(Currying)函数”?
最佳答案
我想你可以说 curried 函数是一个高阶函数,它返回一个函数作为结果。
柯里化(Currying)函数是一个类型类似于 a -> b -> c
的函数。 - 如果添加括号(不会改变类型)a -> (b -> c)
,可以看出这也是高阶的。
但是,您可以编写高阶但没有柯里化(Currying)的函数。例如,下面的简单函数需要一些函数 f
并调用它两次:
let runTwice f = f(); f();
该函数的类型为
(unit -> unit) -> unit
,所以它不是柯里化(Currying)的(它只需要一些输入并返回单位值),但它是高阶的,因为参数是一个函数。虽然像
(+)
这样的功能在技术上是高阶的(类型是 int -> (int -> int)
),我不认为它们是高阶的好例子,因为您通常不以高阶方式使用它们(但它偶尔有用)。更典型的高阶函数示例是 List.map
等函数。将函数作为参数。
关于f# - 高阶函数和柯里化(Currying)函数之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18721202/