Я реализую монадный преобразователь типа Maybe
(он же Option
) в Javascript (обратите внимание, что я использую передачу словаря типов):
const optOfT = of => x =>
of(optOf(x));
const optMapT = map => f => ttx =>
map(optMap(f)) (ttx);
const optApT = chain => ttf => ttx =>
chain(tf =>
chain(tx =>
optAp(tf) (tx)) (ttx)) (ttf);
const optChainT = chain => fm => mmx =>
chain(mx =>
optChain(fm) (mx)) (mmx);
(map ~ <$>
), ap ~ <*>
, цепочка ~ =<<
, of = pure / return)
Пока этот код работает, мне интересно, могу ли я реализовать optApT
без ограничения монады для внешней монады.Я наткнулся на этот пример на Haskell:
(<<**>>) :: (Applicative a, Applicative b) => a (b (s -> t)) -> a (b s) -> a (b t)
abf <<**>> abs = pure (<*>) <*> abf <*> abs
Это кажется именно тем, что я хочу, но я не могу распознать порядок оценки pure (<*>) <*> abf <*> abs
и какой оператор <*>
принадлежит какому аппликативному уровню:
const optApT = (ap, of) => ttf => ttx =>
...?
Любая подсказка приветствуется.