2014-09-21 4 views
7

У нас может быть два типа: 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 аа функтор (или аппликативный функтор), несмотря на то,

  1. один из f и g не является (аппликативным) функтор, а другой, или
  2. ни из них является (аппликативны) функтор,
+2

Трансформатор '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

+0

, возможно, не ответ, но всякий раз, когда «F» и «G» присоединяются, вы получаете монаду в сочинение. –

ответ

8

Это не (ковариантный) функтор

f x = x -> r 

но f . f является «продолжением» функтор (также монада):

f (f x) = (x -> r) -> r 

Это, вероятно, не лучший пример, потому что f контравариантный функтор.

+0

Меня в основном интересуют ковариантные функторы, поэтому я не против, если 'f' контравариантен, пример в порядке. –

+1

Как вы думаете, можно ли найти пример, где 'f' является функтором, но' g' не является (и 'f. G')? –

7

Let g :: *->*. Тогда Const A . g является функтором для любого A, фактически изоморфным Const A.

+0

Тривиальные базовые чехлы делают для хромых (встречных) примеров, но здесь идет. – leftaroundabout

 Смежные вопросы

  • Нет связанных вопросов^_^