превратить закрытие JavaScript в функцию с карри - PullRequest
0 голосов
/ 11 января 2019

Я изучаю карри, и я решил попробовать сделать функцию минимума карри с именем 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

Это не соответствует требованиям карри.

Поэтому, когда я обдумываю, как изменить эту функцию, чтобы она возвращала функцию, я столкнулся с проблемой. Каждый раз, когда карри-функция вызывается с аргументом числа, она должна возвращать минимум (число), но если я правильно понимаю, она также должна возвращать функцию (чтобы ее можно было вызвать еще раз с другим числом). Как это работает?

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Нет, вы неправильно понимаете, карри. Это не означает, что ваша функция должна принимать произвольное количество аргументов (см. здесь о том, как это сделать, допуская несколько связанных вызовов), но только то, что она должна принимать только одно значение аргумента за раз , Ваша getMin функция уже является карри, имеет подпись number -> (number -> number) (взятие двух чисел, возвращение одного). Если бы оно не было карри, вы бы назвали его getMin(5, 4).

0 голосов
/ 11 января 2019

Вам необходимо реализовать функцию 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));
...