Реализация покажет и расскажет?Хорошо -
const identity = x =>
x
const compose = (f = identity, ...fs) => x =>
f === identity
? x
: compose (...fs) (f (x))
const add1 = x =>
x + 1
console .log
( compose () (0) // 0
, compose (add1) (0) // 1
, compose (add1, add1) (0) // 2
, compose (add1, add1, add1) (0) // 3
)
Или вместо использования compose
in-line ...
const ListWithConditionalRendering = compose(
withLoadingIndicator,
withDataNull,
withListEmpty
)(Users);
Вы можете создать своего рода функцию «прямой композиции», гдеаргумент приходит первым -
const $ = x => k =>
$ (k (x))
const add1 = x =>
x + 1
const double = x =>
x * 2
$ (0) (add1) (console.log)
// 1
$ (2) (double) (double) (double) (console.log)
// 16
$ (2) (double) (add1) (double) (console.log)
// 10
$
полезно, когда вы можете поддерживать шаблон -
$ (value) (pureFunc) (pureFunc) (pureFunc) (...) (effect)
Выше, $
помещает значение в своего рода "конвейер ", но нет способа взять значение из .Небольшая настройка позволяет нам писать очень гибкие вариационные выражения.Ниже мы используем $
как способ разграничения начала и конца выражения конвейера.
const $ = x => k =>
k === $
? x
: $ (k (x))
const double = x =>
x * 2
const a =
$ (2) (double) ($)
const b =
$ (3) (double) (double) (double) ($)
console .log (a, b)
// 4 24
Этот разнообразный интерфейс дает вам возможность писать выражения, похожие на заветный оператор |>
, встречающийся в других более функционально-ориентированных языках -
value
|> pureFunc
|> pureFunc
|> ...
|> pureFunc
5 |> add1
|> double
|> double
// 24
Использование $
, что переводится как -
$ (value) (pureFunc) (pureFunc) (...) (pureFunc) ($)
$ (5) (add1) (double) (double) ($) // 24
Техника также прекрасно сочетается с функциями карри -
const $ = x => k =>
$ (k (x))
const add = x => y =>
x + y
const mult = x => y =>
x * y
$ (1) (add (2)) (mult (3)) (console.log)
// 9
Или с чуть более интересным примером -
const $ = x => k =>
$ (k (x))
const flatMap = f => xs =>
xs .flatMap (f)
const join = y => xs =>
xs .join (y)
const twice = x =>
[ x, x ]
$ ('mississippi')
(([...chars]) => chars)
(flatMap (twice))
(join (''))
(console.log)
// 'mmiissssiissssiippppii'