Создание функции 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]