6

当我遇到对这个函数的需求时,我正在玩一些函数式编程,但是我不知道在标准命名法中这种东西是什么。有人认得吗?

function WhatAmIDoing(args...)
   return function()
       return args
   end
end

编辑:概括该函数,它接受可变数量的参数(或者可能是一个隐式列表)并返回一个函数,该函数在调用时返回所有参数,例如咖喱或泡菜,但似乎也不是。

4

7 回答 7

11

WhatAmIDoing 是一个高阶函数,因为它是一个返回另一个函数的函数。

它返回的是一个thunk——一个为延迟计算实际值而创建的闭包。通常创建 thunk 是为了懒惰地评估一个表达式(并且可能记住它),但在其他情况下,只需要一个函数来代替一个裸值,如 " constantly 5" 的情况,在某些语言中返回一个总是返回 5。

后者可能适用于给定的示例,因为假设语言以应用顺序进行评估(即在调用函数之前评估参数),该函数除了将值转换为返回它们的函数之外没有其他用途。

WhatAmIDoing 实际上是我所描述的“不断”功能的实现。但一般来说,您不必只args在内部函数中返回。您可以返回“ ackermann(args)”,这可能需要很长时间,例如...

function WhatAmIDoing2(args...)
   return function()
       return ackermann(args)
   end
end

但是 WhatAmIDoing2 会立即返回,因为对 ackermann 函数的评估将在闭包中暂停。(是的,即使是按值调用的语言。)

于 2009-01-14T13:33:53.797 回答
5

在函数式编程中,将另一个函数作为参数或返回另一个函数的函数称为高阶函数

于 2009-01-14T12:43:49.093 回答
4

我会说 XXXX 返回绑定在 x、y 和 z 值上的未命名函数的闭包。

这篇维基百科文章可能会有所启发

于 2009-01-14T12:34:53.510 回答
2

柯里化是将一个函数转换为一系列函数,每个函数只接受一个参数并返回另一个这样的函数。所以,这个例子与柯里化无关。

酸洗是一个通常用来表示某种序列化的术语。也许用于存储由多个值构建的对象。

如果您感兴趣的方面是返回的函数可以访问 XXXX 函数的参数,那么我会选择 Remo.D。

于 2009-01-14T13:43:32.497 回答
1

正如其他人所说,它是一个高阶函数。由于您的问题中有“模式”,我想我要补充一点,功能语言的这一特性通常是使用没有高阶函数的语言中的策略模式来建模的。

于 2009-01-14T14:19:36.870 回答
1

constantlyClojure中调用了非常相似的东西:

http://github.com/richhickey/clojure/blob/ab6fc90d56bfb3b969ed84058e1b3a4b30faa400/src/clj/clojure/core.clj#L1096

只有constantly返回的函数采用任意数量的参数,使其比您的模式更通用(和灵活)。

我不知道这个模式是否有名字,但会在通常需要函数的情况下使用它,但我只关心返回某个值:

(map (constantly 9) [1 2 3])
=> (9 9 9) 

只是想知道,你用这个做什么?

于 2010-05-12T17:55:34.090 回答
-2

代表?

基本上你正在返回一个函数?还是函数的输出?

没看懂,抱歉。。。

于 2009-01-14T12:33:10.267 回答