【问题标题】:Is branching a required feature of currying?分支是柯里化的必需特性吗?
【发布时间】:2015-01-27 11:31:07
【问题描述】:

在编写柯里函数的实现时,是否需要能够分支?

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 调用我们的柯里化函数并将结果函数存储在变量y 中。

然后我的问题是:我们是否能够独立于应用于x 的进一步操作(在这种情况下将baz 作为下一个参数传递)对y(传递新参数)进行操作。

如果你不确定什么是柯里化,维基百科是这样说的:

在数学和计算机科学中,柯里化是 翻译一个接受多个参数的函数的评估 (或参数元组)评估一系列函数, 每个都有一个参数(部分应用)。

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

更新:

问这个问题的另一种方式是说:一个柯里化函数是否应该简单地保持它的当前状态并且除了应用最后一个参数时不返回任何值,还是每次调用都应该返回一个封装了所有以前的新函数应用参数?

【问题讨论】:

  • 你能简单介绍一下咖喱函数吗?我想我对分支的含义模糊不清。 P.S,我不是反对者。
  • 如果您不熟悉柯里化,那么您可能无法回答我的问题(关于实现它)。无论如何,我已经添加了维基百科的描述。
  • 是的,我不确定为什么要投反对票。也许这个例子不够清楚?
  • 我在代码示例下添加了进一步的描述以帮助解决问题。接近投票似乎是因为不清楚我在问什么。也许现在清楚了?
  • 为什么x("baz") 应该说bar bazx(single_arg) 应该返回一个函数,无论它被调用多少次......

标签: javascript functional-programming currying


【解决方案1】:

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 甚至用于纯函数式语言中,您实际上并没有可变状态的概念。

【讨论】:

  • 好的,很好。看起来我误解了 curried 函数的使用。我的印象是我应该能够将剩余的参数应用于一组链式调用之外的函数。 x('foo'); x('bar') 好像没这个要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 2021-04-04
相关资源
最近更新 更多