代码之家  ›  专栏  ›  技术社区  ›  David J.

将javascript闭包转换为curried函数

  •  0
  • David J.  · 技术社区  · 7 年前

    我正在学习咖喱,我决定尝试制作一个叫做 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
    

    这不符合咖喱的要求。

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

    2 回复  |  直到 7 年前
        1
  •  3
  •   Nina Scholz    7 年前

    你需要实现一个 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));
        2
  •  3
  •   Bergi    7 年前

    不,你误解了咖喱。这并不意味着你的函数应该接受任意数量的参数(参见 here 关于如何在允许多个链式调用的情况下做到这一点),但仅限于一次只接受一个参数值。你的 getMin 已经开始工作了 咖喱,上面有签名 number -> (number -> number) (取两个数字,返回一个)。如果不是咖喱,你就得叫它咖喱 getMin(5, 4) .

    推荐文章