2012-04-26 29 views

Odpowiedz

50

Funktor może przejść z jednej kategorii do innej, endofunktor jest funktorem, dla którego kategoria początkowa i docelowa są takie same.

Tak samo, jak z endomorfizmem a morfizmami.

Dlaczego monady muszą być endofunkturami?

Istnieje słynny cytat, że "Monady to tylko monoidy w kategorii endofunktorów". Na szczęście ktoś inny wyjaśnił już to dość dobrze: in this answer.

Kluczową kwestią, dla której monada musi być endofunktorem, jest to, że join, jak nazywa się w Haskell, lub µ, jak to zwykle nazywane jest w teorii kategorii, jest częścią definicji¹ monady. Teraz

Prelude Control.Monad> :t join 
join :: Monad m => m (m a) -> m a 

więc wynikiem stosowania funktor m do obiektu (w HASK, kategorii typów Haskell jak obiekty i funkcje morfizmów, typ) musi być obiekt, który m można ponownie zastosować do. Oznacza to, że musi należeć do kategorii, która jest domeną funktora m.

Funktor może być złożony ze sobą, jeśli jego domena i kodomena są takie same [ściśle, jeśli jej kodomena jest podkategorią jej domeny], innymi słowy, jeśli jest to endofunktor. Ponieważ kompozycie ze sobą jest częścią definicji monady, monady są a fortoforami endofunktur.

¹ Jedna definicja, alternatywnie można zdefiniować monadę za pomocą (>>=) lub bind i mieć join jako właściwość pochodną.

+4

Czy są jakieś funktory w Haskell, które nie są endofunkturami? (Czy nie wszystkie mapują Hask do Hask?) – huon

+4

Dobrze, wszystkie funktory Haskella są endo. –

+3

Non-endofunktory są dostępne w pakietach takich jak http://hackage.haskell.org/packages/archive/categories/1.0/doc/html/Control-Categoryical-Functor.html – sdcvvc

Powiązane problemy