我正在读一本书,用F#进行函数编程,其中的他说 (第33页),在“高阶函数声明”一节中。
我们已经看到了(+)和(<<)这样的高阶内置函数。
在这一节的末尾
高阶函数也可以通过在let-声明中提供如下参数来定义: 设重量ro s= ro *s ** 3.0;
然而,在我今天早些时候问的问题的底部有一些有用的注释(最初的标题是“何时将我的函数写为高阶函数”),这些注释似乎对这些示例是否实际上是高阶函数产生了一些疑问。
维基百科高阶函数的定义是:
高阶函数(也是函数形式、函数式或函数式)是这样一个函数:(i)接受一个或多个函数作为输入;(ii)输出一个函数。
一方面,我可以看到像(+)和weight这样的函数可能被认为是高阶函数,因为给定一个参数,它们返回一个函数。另一方面,我可以看到,它们被正确地看作是仓促的函数。我正在学习F#作为一个自学项目,并希望得到明确的概念,所以在这个网站上的答案和讨论是特别有用的。
我的问题是,这些函数的正确术语是什么,也许更重要的是,人们通常如何使用“高阶函数”和“匆匆函数”这两个术语?
发布于 2013-09-10 14:15:14
我想你可以说咖喱函数是一个高阶函数,它作为结果返回一个函数。
咖喱函数是一个类型类似于a -> b -> c的函数-如果添加括号(不改变类型) a -> (b -> c),您可以看到这也是更高的顺序。
但是,您可以编写更高级的函数,但不能草率编写。例如,下面的简单函数接受一些函数f并两次调用它:
let runTwice f = f(); f();这个函数有一个类型的(unit -> unit) -> unit,所以它不是草率的(它只需要一些输入并返回单位值),但是它是高阶的,因为参数是一个函数。
虽然像(+)这样的函数在技术上是高阶的(类型是int -> (int -> int)),但我不认为它们是高阶的好例子,因为您通常不以更高的方式使用它们(但它偶尔会有用)。更典型的高阶函数例子是像List.map这样以函数作为参数的函数。
发布于 2013-09-20 23:34:13
粗略地说,咖喱函数是高阶函数的子集.高阶函数在其结果中接受函数作为参数或返回函数。咖喱函数是以咖喱形式写成的多元函数,如接受第一个参数的函数,以及返回接受第二个参数的函数等等。
上面托马斯就是这么说的。然而,我认为这里有一个微妙之处。我不认为返回函数的所有函数都是仓促的,我认为Tomas的语句“如果您添加括号(它不改变类型)”在F#中是不准确的。
具体而言,考虑一个函数接受一个参数,有一个副作用,然后返回另一个函数,该函数接受另一个参数并返回一个结果:
let f x =
printfn "%d" x
fun y -> x+yF#推断出以下类型:
val f : int -> (int -> int)请注意,它在里面放了看似多余的括号,我相信,正是因为这些类型之间有细微的差别。
此外,尽管这个函数返回一个函数作为其结果,但我不认为它可以作为一个临时函数,因为这是一个副作用。这不是用乱码形式重写的多元函数..。
https://stackoverflow.com/questions/18721202
复制相似问题