将javascript封闭功能转换为咖喱函数

时间:2019-01-11 09:00:42

标签: javascript functional-programming closures currying

我正在学习有关curring的知识,因此我决定尝试制作一个称为getMin的经过咖喱的最小函数。

据我了解,这意味着我应该可以打电话 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

这不符合currying的要求。

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

2 个答案:

答案 0 :(得分:3)

您需要实现一个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));

答案 1 :(得分:3)

不,您是在误会科林。这并不意味着您的函数应该接受任意数量的参数(有关如何执行此操作同时允许进行多个链式调用的信息,请参见here),而不仅仅是一次应仅接受一个参数值。您的getMin函数已经 被管理,它的签名为number -> (number -> number)(取两个数字,返回一个)。如果不是咖喱,则必须将其称为getMin(5, 4)