В конце концов я отвечу на ваш вопрос, но давайте сначала сделаем шаг назад.
Важно понимать, что метод pipe - это просто приложение функции . Другими словами: future.pipe (f) == f (future)
.
Это означает, что ваша функция канала может быть переопределена следующим образом:
const pipe = fn => future => future.pipe(fn)
//to:
const pipe = fn => value => fn (value)
Эта новая версия канала работает точно так же, за исключением того, что она работает на любые ценности, а не только фьючерсы. Но давайте сделаем еще шаг назад.
Сигнатура этой функции следующая: 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]