Можете ли вы карри функцию, которая имеет только один параметр, который является объектом - PullRequest
0 голосов
/ 02 ноября 2018

Вот пример карри расчета объема прямоугольной призмы. Это учебник карри.

function volume(l, w, h) {
    return l * w * h;
}

function curriedVolume(length) {
    return function(width) {
        return function(height) {
            return height * width * length;
        }
    }
}

volume(2, 3, 4); // 24
curriedVolume(2)(3)(4); // 24

Вот аналогичный пример, за исключением того, что функция без карри принимает один параметр, который является объектом.

function volume(dimensions) {
    return dimensions.l * dimensions.w * dimensions.h;
}

function curriedVolume(dimension, finalDimensions={}) {
    Object.assign(finalDimensions, dimension);
    if (Object.keys(finalDimensions).length === 3) {
        return finalDimensions.l * finalDimensions.w * finalDimensions.h;
    }
    return function(dimension) {
        return curriedVolume(dimension, finalDimensions);
    }
}

volume({
    l: 2,
    w: 3,
    h: 4,
});
curriedVolume({ l: 2 })({ w: 3 })({ h: 4 }); // 24
curriedVolume({ w: 2, h: 3 })({ l: 4 }); // 24

Это все еще считается "карри"? Это действительно?

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

Я прокомментировал, что этот вопрос является в некоторой степени вопросом мнения, но я заинтригован достаточно, чтобы предложить свою точку зрения, несмотря на то, что чувствую себя несколько непослушным. Я не дал однозначного ответа (потому что я не уверен, что он существует), но в ходе расследования я собираюсь утверждать, что ваш второй пример не является карри, как обычно подразумевается под термином.

Ваш пример будет частично применять параметры до тех пор, пока он не закроет их достаточно для вычисления результата, после чего он вернет вычисленный объем. Это не подлежит обсуждению.

Чтобы утверждать, что это пример карри, вам придется утверждать, что:

  1. Внешняя функция принимает три аргумента, они просто оказываются скрытыми внутри параметра объекта, а затем это
  2. Каждая частично примененная функция, которая возвращается, объявляет единственный параметр объекта

Оба эти утверждения должны быть верными, чтобы ваш пример соответствовал определению карри.

Однако теперь вы находитесь в противоречии. По 1) аргумент объекта не является «действительно» единственным параметром. Но затем в 2) вы должны прямо противоречить 1), чтобы утверждать, что возвращаемые функции являются функциями только одного аргумента. Так что есть это несоответствие.

За исключением семантики, передача одного объекта в качестве аргумента изменяет механику вызова функции карри, так что вы можете вызывать ее с объектом, который содержит все три псевдо-аргумента (свойства объекта), если они у вас есть, в которых Если вы не получите возвращаемое значение функции - вместо этого вы сразу получите вычисленный объем. Это делает функцию нетривиально повторной. Представьте, что вы передаете объекты этой функции, которые являются результатом какого-либо потока данных. Теперь ваша функция ведет себя по-разному с одной и той же строкой кода, в зависимости от состояния объекта, который вы ей даете. Опять же, возможно, это не подчиняется «духу закона», когда дело доходит до карри, потому что вы ввели в функцию побочный эффект, который затрудняет рассуждение о поведении вашего кода.

Наконец, и, возможно, самое главное, написав функцию, которая получает объект в качестве аргумента, вы стерли сигнатуру типа вашей функции, чтобы из нее ничего не было выведено без чтения самого внутреннего кода. Это сделает невозможным использование в метапрограммирующем подходе, поскольку он будет использовать ту же сигнатуру типа, что и функция, которая ожидает объект с двумя свойствами, или четырьмя, или десятью.

0 голосов
/ 02 ноября 2018

Да, использование объекта в функции все еще карри.

enter image description here

См. эту цитату :

Названный в честь Haskell Brooks Curry, карри - это процесс разбиения функции на серию функций, каждая из которых принимает один аргумент ...

А с здесь :

Карринг - это метод вычисления функции с несколькими аргументами в последовательность функций с одним аргументом.

Так что, пока у вас нет двух аргументов в вашей функции, тогда да, это все еще считается "карри".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...