f# - 高阶函数和柯里化(Currying)函数之间的区别

标签 f# functional-programming functor higher-order-functions currying

我在看书,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/

相关文章:

f# - Xamarin Studio f# 项目无法在 OSX 上构建

python - 如何理解将 IP 字符串转换为整数的函数式编程代码?

c++ - 通过 boost::algorithm::join 和 boost::adaptors::transformed 转换 std::vector of boost.asio::ip::address

C++ 摆脱单例 : alternative to functors and static methods

algorithm - 如何在订单行上按比例分配折扣?

azure - Azure 是否支持构建 F# 3.0/VS2012 项目?

javascript - lambda : Confused about pipe

haskell - 为什么 Control.Arrow 中没有 Kleisli 的 Functor 实例?

C++ Templated Functor (based on Modern C++ Design)编译错误

f# - Visual Studio 2019 F# NU1101 无法找到包 FSharp.core