我在读一本书,使用 F# 进行函数式编程 https://rads.stackoverflow.com/amzn/click/com/1107684064, which (第 33 页),在 部分高阶函数的声明
我们已经看到了高阶内置函数,例如 (+) 和 (
并在本节的末尾
高阶函数也可以通过在 let 声明中提供如下参数来定义:
let weight ro s = ro * s ** 3.0;;
然而,在底部有一些有用的评论我今天早些时候问的问题 https://stackoverflow.com/questions/18718232/when-should-i-write-my-functions-in-curried-form(最初的标题是“我什么时候应该将函数编写为高阶函数”),这似乎对这些示例是否实际上是高阶函数产生了一些疑问。
The 高阶函数的维基百科定义 http://en.wikipedia.org/wiki/Higher-order_function is:
高阶函数(也称为函数形式、泛函或函子)是至少执行以下操作之一的函数: (i) 将一个或多个函数作为输入; (ii) 输出一个函数。
一方面,我可以看到类似的功能(+)
, and weight
可能被视为高阶函数,因为给定单个参数它们返回一个函数。另一方面,我可以看到它们被正确地视为柯里化函数。我正在将 F# 作为自学项目来学习,并且希望弄清楚其中的概念,因此本网站上的答案和讨论特别有帮助。
我的问题是,这些函数的正确术语是什么,也许更重要的是,人们通常如何使用术语“高阶函数”和“柯里化函数”?
我想你可以这么说柯里化函数 is a 高阶返回函数作为结果的函数。
柯里化函数是一个具有如下类型的函数a -> b -> c
- 如果添加括号(不会改变类型)a -> (b -> c)
,你可以看到这也是高阶的。
但是,您可以编写以下函数高阶但没有咖喱。例如,以下简单函数需要一些函数f
并调用它两次:
let runTwice f = f(); f();
这个函数有一个类型(unit -> unit) -> unit
,所以它不是柯里化的(它只接受一些输入并返回单位值),但它是高阶的,因为参数是一个函数。
虽然功能类似于(+)
技术上是高阶的(类型是int -> (int -> int)
),我不认为它们是高阶的好例子,因为你通常不会以高阶的方式使用它们(但偶尔有用)。高阶函数更典型的例子是这样的函数List.map
以函数作为参数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)