6

当我遇到这个函数的需求时,我正在玩弄一些函数式编程,但是我不知道标准命名法中这种东西被称为什么。 任何人都认可它?叫做什么功能“模式”?

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

编辑:广义的功能,它需要的参数变量量(或者可能是隐式的列表),并返回一个函数,当调用返回所有指定参数时,像咖喱或泡菜,但它似乎也不是。

+0

我不认为我会称它为一种模式,而不是如果语句是模式。模式通常可以解决特定的问题。这只是一个非常基础的语言结构。你只是有一个返回闭包的高阶函数。 – jalf 2009-01-14 13:01:04

+0

什么是上下文?我们谈论的代码有多少?只是内部函数能够访问外部定义的变量吗?这只是一个封闭。还是你能够返回嵌套函数?这只是高阶函数的一个属性。 – jalf 2009-01-14 13:08:22

回答

10

WhatAmIDoing是higher-order function,因为它是一个返回另一个函数的函数。

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

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

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

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

但WhatAmIDoing2将立即返回,因为阿克曼函数的评价将在closure暂停。 (是的,即使是按价值计算的语言。)

-2

代表?

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

听不懂,对不起......

+0

这不是你平常的C#的东西。函数式编程是一个完全不同的世界,函数返回函数 – 2009-01-14 12:34:32

+0

弗雷德里克是正确的,它不是通常的东西,但我也不知道要在我正在做的事上写一个名字,尽管这似乎是一件有用的事情 – 2009-01-14 12:36:11

4

我要说的是XXXX返回绑定上的X,Y和Z值的匿名函数的关闭

wikipedia制品可以阐明一些

5

在函数编程一个函数,另一个函数作为参数或返回另一个函数称为higher-order function

2

Currying是关于将函数转换为函数链,每个函数只接受一个参数并返回另一个此类函数。所以,这个例子与currying没有关系。

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

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

1

正如其他人所说,这是一个higher-order function。由于您在问题中有“模式”,因此我想补充一点,这种功能语言的功能通常使用strategy pattern以不具有高阶功能的语言进行建模。

1

非常类似的东西是用Clojure称为constantly

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

只有那constantly回报需要的参数任意数量的功能,使其成为更普遍的(灵活),比你的格局。

我不知道,如果这种模式有一个名称,但会在正常功能的情况下,预计使用它,但我关心的是一定值返回:

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

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