Каррирование и частичное применение

Я, оказывается, путал раньше каррирование и частичное применение. Даже не то чтобы путал, просто не пытался разобраться в чём разница между терминами, применяя то и другое по мере надобности. Недавно на «Хабре» в комментариях мне на моё незнание указали и я уяснил, наконец, что конкретно стоит за каждым термином.

Каррирование — преобразование функции от двух аргументов в функцию от первого аргумента, возвращающую функцию, результат вызова которой со вторым агрументом эквивалентен вызову первоначальной функции с упомянутыми аргументами. Немного запутанно, с примерами станет всё яснее. Я буду объяснять на примере Джаваскрипта, его больше народу знает, а на ПХП очень уж многословно получается. Кстати, в соответствующую статью в «Википедии» я добавил пример на «Гугл Гоу».

// функция, суммирующая два числа
function sum(x, y) {
    return x+y;
}

alert(sum(2, 8)); // вернёт 10

function sum(x) {
    return function (y) {
        return x+y;
    }
}

alert(sum(2)(8)); // тоже вернёт 10

При вызове второй функции sum создаётся функция, в которую из-за замыкания, «железно» попадает аргумент «x» со значением «2». Поэтому возвращаемая функция будет всегда суммировать с двойкой. С этим фактом тесно связано частичное применение, потому что оно только что, фактически, состоялось.

Частичное применение функции (Partial function) — создание некой функции на базе указанной, где некоторые агрументы заменены конкретными значениями. Например:

function partial_one_arg(f, a) {
    return function(b) {
        return f(a, b);
    }
}

min0 = partial_one_arg(Math.min, 0);
min1 = partial_one_arg(Math.min, 1);

alert([min0(-5), min0(5)]); // вернёт [-5, 0]
alert([min1(-5), min1(5)]); // вернёт [-5, 1]

В примере я заменил один из агрументов фунции нахождения минимального значения на конкретное значение, теперь при вызове функции «min0» сравнение будет идти с нулём, при вызове «min1» — с единицей.

Очень простые штуки, часто встречающиеся в функциональном программировании.

8 комментариев

Смените это немедленно!

«Альфа-банк» заставляет меня через какой-то срок менять пароли к банку. Я этого делать не хочу. Мне совершенно не нравится запоминать новый пароль, у меня их и так туча, я совершенно не разделяю мнение, что регулярная смена пароля решает какую-то проблему безопасности.

Ещё банк помнит последние несколько паролей, так что менять два пароля по кругу тоже не получается.

Меня не устраивает метод, которым пользуются некоторые ребята — менять в конце пароля цифру. Я уже пару раз запутывался. Кстати, когдя я работал в «Яндексе», там тоже действовала похожая схема с регулярной схемой и запоминанием пароля.

В веб-клиентах банков я пользуюсь одним и тем же трюком (кстати, в «Яндексе» я тоже его применял). Когда приходит время менять пароль, я его меняю. Потом звоню в техподдержку и говорю — ребята, я пароль забыл, мне жутко неудобно, сбросьте мне его, пожалуйста. Пароль сбрасывают (с ним почему-то всегда сбрасывается и история паролей), я ставлю прежний пароль, все довольны.

Банк меня «защитил», я пользуюсь тем же паролем.

Интересно, что все три веб-клиента банка, которыми я пользовался, не позволяли сделать с моей карточкой ничего серьёзного, используя только пароль на вход.

Максимум — посмотреть на что я трачу деньги. «Альфа» присылает мне одноразовый пароль платежа через СМС, «Райффайзен» разрешал платить только с использованием клиентского сертификата, «Ак барс» просит ввести одноразовый циферный код со специальной карточки.

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

Самое смешное, что любые банки определяют мою личность по телефону, по данным, которые легко узнать в интернете, плюс некое ключевое слово, которое, внимание, никогда не меняется в отличие от пароля. Хотите меня ограбить? Узнайте ключевое слово, зачем вам пароль?

18 комментариев