Qualcuno può spiegare in termini semplici la differenza tra i due? Non capisco appieno la parte in cui le monadi sono endofuntori contro essere solo dei funtori.Differenze tra funtori e endofuntori
risposta
Un functor può passare da una categoria a un'altra, un endofunctor è un funtore per cui la categoria iniziale e quella di destinazione sono le stesse.
Uguale a quello degli endomorfismi rispetto ai morfismi.
Ora, perché le monadi devono essere endofuntor?
C'è la famosa citazione che "le Monade sono solo monoidi nella categoria dei endofunzionisti". Fortunatamente, qualcun altro ha già spiegato che piuttosto bene in this answer.
Il punto principale per cui una monade deve essere un endofunctor, è che join
, come viene chiamato in Haskell, o µ
, come viene solitamente chiamato teoria delle categorie, fa parte della definition¹ di una monade. Ora
Prelude Control.Monad> :t join
join :: Monad m => m (m a) -> m a
così il risultato dell'applicazione funtore m
ad un oggetto (in Hask, la categoria di tipi Haskell come oggetti e funzioni morfismi, un tipo) deve essere un oggetto che m
può nuovamente essere applicato a. Ciò significa che deve appartenere alla categoria che è il dominio del functor m
.
Un functor può essere composto solo con se stesso se il dominio e il codominio sono gli stessi [in senso stretto, se il suo codominio è una sottocategoria del suo dominio], in altre parole, se è un endofunctor. Poiché la componibilità con se stessa fa parte della definizione di una monade, le monadi sono a fortiori endofuncori.
¹ Una definizione, si può in alternativa definire una monade utilizzando (>>=)
o bind
e avere join
come proprietà derivata.
Ci sono dei funtori in Haskell che non sono endofunzionisti? (Non tutti mappano Hask a Hask?) – huon
Giusto, tutti i functors di Haskell sono endo. –
I non endofuncanti sono disponibili in pacchetti come http://hackage.haskell.org/packages/archive/categories/1.0/doc/html/Control-Categorical-Functor.html – sdcvvc