У нас может быть два типа: f, g :: * -> *
, так что они не монады, а их состав. Например, для произвольного фиксированного s
:Может ли два не-функтора составить функтору?
f a := s -> a
g a := (s, a)
g a
не монада (если не ограничивать s
к моноиде), но f (g a)
это состояние монады s -> (s, a)
. (В отличии от функторов и аппликативных функторов, даже если оба f
и g
были монады, their composition might not be.)
Есть ли подобный пример для функторов или аппликативных функторов? То есть, что состав f
и g
аа функтор (или аппликативный функтор), несмотря на то,
- один из
f
иg
не является (аппликативным) функтор, а другой, или - ни из них является (аппликативны) функтор,
Трансформатор 'ContT' делает' Functor 'и' Applicative ', не требуя, чтобы преобразованная структура была« Functor », но не была построена композицией. http://hackage.haskell.org/package/transformers-0.4.1.0/docs/Control-Monad-Trans-Cont.html#t:ContT Аналогично, бесплатный аппликативный 'Ap' добавляет поведение« Applicative »к любому« Functor » ', не требуя, чтобы он был« аппликативным », но опять же не построен по составу. http://hackage.haskell.org/package/free-4.9/docs/Control-Applicative-Free.html#t:Ap – Cirdec
, возможно, не ответ, но всякий раз, когда «F» и «G» присоединяются, вы получаете монаду в сочинение. –