Создание функции composePipe для Futures из Fluture

Я хотел сделать функцию компоновки для трубопровода, и я застрял. Мне удалось сделать трубку без точек, но я не могу понять, как ее сочинять.

// pointfree
const pipe = fn => future => future.pipe(fn)


// compose pipes   // not working
const composePipe = (...fns) => (...args) => fns.reduceRight(  (future, fn) => future.pipe(fn), args)[0];

1 ответ

Решение

В конце концов, я отвечу на ваш вопрос, но сначала сделаем шаг назад.

Важно понимать, что метод pipe - это просто приложение-функция. Другими словами:future.pipe (f) == f (future).

Это означает, что ваша функция pipe может быть переопределена как таковая:

const pipe = fn => future => future.pipe(fn)
//to:
const pipe = fn => value => fn (value)

Эта новая версия pipe работает точно так же, за исключением того, что она работает с любыми значениями, а не только с Futures. Но давайте сделаем еще шаг назад.

Сигнатура этой функции следующая: pipe :: (a -> b) -> a -> b. Он принимает функцию от A до B и возвращает функцию от A до B.

Подождите минуту....

const pipe = fn => value => fn (value)
//to:
const pipe = fn => fn

Это новое определение делает то же самое. За исключением того, что он работает с чем угодно, а не только с функциями. На самом деле это просто функция идентичности. Итак, карри-версия (вы сказали, что это бесполезная, но я думаю, вы имели в виду карри) версиюfuture.pipe это просто функция идентичности.

Так почему это? Потому что все.pipeделает это приложение-функция. И вы можете сами применить свои функции.


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

Если вы используете Ramda, это pipe. Но мы можем реализовать это сами:

const pipe = (...fns) => (...args) => fns.reduce ((args, f) => [f (...args)], args)[0]
Другие вопросы по тегам