分支是一个必要的currying功能?

时间:2015-01-27 11:31:08

标签: javascript functional-programming currying

在编写咖喱函数的实现时,是否需要能够进行分支?

Javascript中的用法示例:

var foo = function (a, b) { console.log(a, b); },
x = curry(foo),
y = x('bar'); // An example of branching

x('baz'); // -> 'bar baz'
y('qux'); // - > 'bar qux'

这里的示例显示我们第一次使用值bar调用curried函数,并将结果函数存储在变量y中。

我的问题是:我们是否能够独立于y的进一步操作{(1}}(传递新参数)进行操作(在这种情况下,将x作为下一个参数传递)。

如果你不确定curry是什么,这就是维基百科所说的:

  

在数学和计算机科学中,currying是技术   翻译带有多个参数的函数的求值   (或一组参数)评估一系列函数,   每个都有一个参数(部分申请)。

http://en.wikipedia.org/wiki/Currying

更新

提出这个问题的另一种方法是说:如果一个curried函数只是保持它的当前状态并且除了应用最终参数之外没有返回任何值,或者每个调用都应该返回一个新函数函数封装所有以前应用的参数?

1 个答案:

答案 0 :(得分:3)

currying通常意味着调用一个小于预期参数数量的函数将返回一个期望剩余缺失参数的函数。

它应该在函数对象上累积状态......

f = curry(function(x, y, z) { return x+y+z; });

g = f(1)  // --> <func>
h = g(2)  // --> <func>
h(3)      // --> 6  (computed from 1+2+3)
g(10, 20) // --> 31 (computed from 1+10+20)

currying甚至用于纯函数式语言,你实际上并没有可变状态的概念。