Создание функции composePipe для Futures из Fluture - PullRequest
0 голосов
/ 30 января 2020

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

// 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 Ответ

1 голос
/ 30 января 2020

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

Важно понимать, что метод 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]
...