Я люблю Javascript и функциональное программирование. Я знаю, что они оба сейчас «горячие», но они делают меня счастливым. Моим первым знакомством с FP было использование Lodash. Как и многие другие, я всегда чувствовал, что есть функция lodash, которая решает все. Затем я обнаружил lodash / fp. Это было даже веселее. Затем я открыл для себя Рамду. Как ни странно, я хотел знать об этом все.

Вчера я просматривал документы и решил, что некоторые из них довольно плотные. Итак, я хочу пройтись по каждой функции и использовать ее. Может, сделаю по одному в будний день. Надеюсь, я смогу выучить это, а затем объяснить (возможно, немного). Скорее всего, в конечном итоге я не буду доводить дело до конца, но я постараюсь. Я начну сверху и буду работать по алфавиту.

Первый - R.__. Документы говорят, что это заполнитель. Мне нравится думать об этом как об I.O.U. от кого-то уважаемого. Вы берете I.O.U. как замена тому, чего вы действительно хотите, но на самом деле вы просто ждете денег. Таким же образом мы можем использовать R.__ как I.O.U. для каррированной функции. Карри важна, и я знаю, что буква «C» находится довольно далеко, поэтому давайте коснемся этого на секунду.

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

// not curried
const add = (a,b) => a+b;
add(1) // 1undefined

// cheap curry
const add = a => b => a+b;
add(1) // function
add(1)(2) // 3

Мое карри дешевое, но концепция та же. Мы можем передать первый параметр в какой-то момент и получить функцию, ожидающую следующего параметра. Как только все параметры переданы, мы получаем результат.

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

I.O.U.

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

const divide = R.curry((num, den) => num/den);
// will cause problems
divide()(3) // NaN
divide(R.__)(3) // function
divide(R.__)(3)(21) // 7

Видеть! Мы дали нашей функции I.O.U и сделали это хорошо. Как только мы это сделали, мы получили результат. А до тех пор мы получаем жуткую функцию дыхания ртом, которая тихо напоминает нам, что мы ему что-то должны.

Я обнаружил, что обычно использую это, когда работаю с устаревшими функциями, которые имеют нечетный порядок параметров. Это позволяет мне привязать параметры к функции, когда я буду готов, и получу их в области видимости. Затем я просто передаю связанную функцию! УРА!

День 1 пройден.