首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高阶函数与咖喱函数的区别

高阶函数与咖喱函数的区别
EN

Stack Overflow用户
提问于 2013-09-10 14:09:19
回答 2查看 736关注 0票数 5

我正在读一本书,用F#进行函数编程,其中的他说 (第33页),在“高阶函数声明”一节中。

我们已经看到了(+)和(<<)这样的高阶内置函数。

在这一节的末尾

高阶函数也可以通过在let-声明中提供如下参数来定义: 设重量ro s= ro *s ** 3.0;

然而,在我今天早些时候问的问题的底部有一些有用的注释(最初的标题是“何时将我的函数写为高阶函数”),这些注释似乎对这些示例是否实际上是高阶函数产生了一些疑问。

维基百科高阶函数的定义是:

高阶函数(也是函数形式、函数式或函数式)是这样一个函数:(i)接受一个或多个函数作为输入;(ii)输出一个函数。

一方面,我可以看到像(+)weight这样的函数可能被认为是高阶函数,因为给定一个参数,它们返回一个函数。另一方面,我可以看到,它们被正确地看作是仓促的函数。我正在学习F#作为一个自学项目,并希望得到明确的概念,所以在这个网站上的答案和讨论是特别有用的。

我的问题是,这些函数的正确术语是什么,也许更重要的是,人们通常如何使用“高阶函数”和“匆匆函数”这两个术语?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-10 14:15:14

我想你可以说咖喱函数是一个高阶函数,它作为结果返回一个函数。

咖喱函数是一个类型类似于a -> b -> c的函数-如果添加括号(不改变类型) a -> (b -> c),您可以看到这也是更高的顺序。

但是,您可以编写更高级的函数,但不能草率编写。例如,下面的简单函数接受一些函数f并两次调用它:

代码语言:javascript
复制
let runTwice f = f(); f();

这个函数有一个类型的(unit -> unit) -> unit,所以它不是草率的(它只需要一些输入并返回单位值),但是它是高阶的,因为参数是一个函数。

虽然像(+)这样的函数在技术上是高阶的(类型是int -> (int -> int)),但我不认为它们是高阶的好例子,因为您通常不以更高的方式使用它们(但它偶尔会有用)。更典型的高阶函数例子是像List.map这样以函数作为参数的函数。

票数 12
EN

Stack Overflow用户

发布于 2013-09-20 23:34:13

粗略地说,咖喱函数是高阶函数的子集.高阶函数在其结果中接受函数作为参数或返回函数。咖喱函数是以咖喱形式写成的多元函数,如接受第一个参数的函数,以及返回接受第二个参数的函数等等。

上面托马斯就是这么说的。然而,我认为这里有一个微妙之处。我不认为返回函数的所有函数都是仓促的,我认为Tomas的语句“如果您添加括号(它不改变类型)”在F#中是不准确的。

具体而言,考虑一个函数接受一个参数,有一个副作用,然后返回另一个函数,该函数接受另一个参数并返回一个结果:

代码语言:javascript
复制
let f x =
  printfn "%d" x
  fun y -> x+y

F#推断出以下类型:

代码语言:javascript
复制
val f : int -> (int -> int)

请注意,它在里面放了看似多余的括号,我相信,正是因为这些类型之间有细微的差别。

此外,尽管这个函数返回一个函数作为其结果,但我不认为它可以作为一个临时函数,因为这是一个副作用。这不是用乱码形式重写的多元函数..。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18721202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档