【问题标题】:Can I write an infinitely curried function? [duplicate]我可以写一个无限柯里化的函数吗? [复制]
【发布时间】:2016-08-16 21:24:19
【问题描述】:

从我读过的关于函数式编程的书中,我了解了 JavaScript 中的闭包以及它们如何工作。一个简单的例子是:

function StringCon(arg) {
   return function (ar) {
    return arg + ar;

   }
 }
StringCon("hello")(" world")//-> "hello world"

但是当我们想要添加更多参数时,我们需要返回越来越多的函数,这会很快造成混淆。

我想创建一个函数,它允许我传入一个字符串,并能够通过更多函数调用添加到这个函数中。当最终传递一个空调用时,它应该返回连接的字符串。 示例可能如下所示。

StringCon("I ")("am ")("new ")("to")(" JavaScript")();//-> I am new to JavaScript

另外,如果不完全可能,最接近的解决方案是什么? 提前致谢!

【问题讨论】:

  • 你在说什么看起来像 currying here
  • 我不知道,我应该将问题的名称更改为“Curring in JavaScript”吗?
  • @Alex 我想这取决于您是否有特定的柯里化问题。已经有examples 展示了如何实现它。
  • 无论如何,你的问题本质上是“我可以写一个无限柯里化的函数吗?”?如果是这样,答案是“是”,但有一个问题 - 如果事先不知道参数的数量,或者不做 something 来结束链条,你就不能完全拥有你的例子。 something 可能会在末尾添加 (),如果您的 curry 功能没有看到输入,它会返回结果。其他人在返回的 curried 函数上添加了一个 execute 方法 on,这样你就可以使用 f(1)(2)(3).exec() 来获得结果。预先确定咖喱有点容易,所以你会喜欢curry(5)(StringCon)
  • nicematt,我想我应该是那个感到抱歉的人,我没有很好地解释这个问题。看一下,我加了一些解释

标签: javascript


【解决方案1】:

基本上你可以:

  • 创建一个返回StringCon的函数;
  • 在此函数的任何属性中记住arg;
  • 使用存储arg的属性获取拼接结果;

您不能直接访问连接结果,因为您必须重新调用返回,即使使用代理也是如此。也可以限制调用以在有限调用中返回最终结果。


function StringCon(arg) {
    var f = function(x) {
        return StringCon(arg + x);
    };
    // var f = StringCon.bind(this, arg + x);

    f.value = arg;

    return f;
}

StringCon("I ")("am ")("new ")("to")(" JavaScript")
.value // -> "I am new to JavaScript"

【讨论】:

    【解决方案2】:

    听起来像你在这样的事情之后:

    function concat() {
        return Array.prototype.slice.call(arguments).join(' ');
    }
    

    接受许多参数,将它们连接起来并且不返回另一个函数。 (我错过了什么吗?)

    【讨论】:

    • 是的。函数调用。 TO 使用 currying。
    • "不返回另一个函数" 这个想法是它确实返回一个函数,只要有更多可能的参数。它应该返回该函数的部分应用程序。
    • 很遗憾,这不是我想要的,我想保留这种格式 f(arg)(arg)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 2022-11-22
    • 1970-01-01
    • 2018-07-08
    相关资源
    最近更新 更多