【问题标题】:turn javascript closure into a curried function将 javascript 闭包变成咖喱函数
【发布时间】:2019-06-06 04:21:51
【问题描述】:

我正在学习 currying,我决定尝试创建一个名为 getMin 的 curry 最小函数。

据我了解,这意味着我应该可以调用 getMinimum(5)(2)(6) 并让它返回 2

我试图用一个简单的闭包来实现它,我想出了一些返回数字而不是函数的东西。这是我的代码:

function getMin(val){
    var min = val
    function calc(num){
        if(num<min){
            // set new minimum
            min = num
            return num
        }
        else {
            return min
        }
    }
    return calc
}


var x = getMin(5) // => 5
console.log(x(6))
console.log(x(4))
console.log(x(8))
console.log(x(2))

此日志:

5
4
4
2

这不符合柯里化的要求。

所以当我考虑如何更改此函数以使其返回一个函数时,我遇到了一个问题。每次使用数字参数调用 curried 函数时,它应该返回最小值(一个数字),但如果我理解正确,它也应该返回一个函数(以便可以用另一个数字再次调用它)。这是如何工作的?

【问题讨论】:

  • 你永远不会登录x,这是getMin(5)的回报。就是这个功能

标签: javascript functional-programming closures currying


【解决方案1】:

不,你误解了柯里化。这并不意味着您的函数应该采用任意数量的参数(请参阅here,了解如何在允许多个链式调用的同时做到这一点),而只是它一次应该只采用一个参数值。您的getMin 函数已经 curried,它具有签名number -&gt; (number -&gt; number)(取两个数字,返回一个)。如果它不是咖喱,您必须将其称为getMin(5, 4)

【讨论】:

  • 如果 getMin 已经被 curried 了,我不应该可以调用getMin(5)(4)(6) 并得到4 吗?当我尝试这个时,我得到getMin(...)(...) is not a function
  • 我明白你的意思;你不一定说这个函数是有效的,只是它被柯里化了。
【解决方案2】:

你需要实现一个toString函数,如果需要原始值,则返回结果,否则返回函数。

function getMinimum(m) {
    function min(v) {
        m = Math.min(m, v);
        return min;
    }
    min.toString = _ => m;
    return min;
}


console.log(getMinimum(5)(2)(6));
console.log(getMinimum(3)(2)(1)(-1000));

【讨论】:

  • @MoritzRoessler,这在这里不起作用,因为 console.log 的这个实现需要一个字符串,而带有数字的 valueOf 会产生函数本身。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多