MaybeT аппликативный экземпляр без ограничения монады для внешней монады - PullRequest
3 голосов
/ 10 марта 2019

Я реализую монадный преобразователь типа 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 =>
  ...?

Любая подсказка приветствуется.

1 Ответ

2 голосов
/ 10 марта 2019

Надеюсь, это поможет ...

Вот типы, связанные с различными функциями класса типов:

abf <<**>> abs = pure (<*>) <*> abf <*> abs
                  (4)  (3)  (2)     (1)

(1), (2): the `ap` for type a
(3): the `ap` for type b
(4): the `pure` for type a

И порядок оценки:

(pure (<*>)) <*> abf <*> abs
...