2016-06-06 12 views
5

Dopo aver studiato la teoria delle categorie basata sui libri MacLane, Awodey e Spivak, sto cercando di capire la monade libera/operativa in Haskell.Coyoneda and Deriving Functor in Haskell

Possiamo ottenere una monade da un solo tipo di dati utilizzando Control.Monad.Free dopo averlo trasformato in un functor con Data.Functor.Coyoneda, che si basa sullo sfondo matematico chiamato lemma Yoneda.

Ma non sto capendo appieno che il functor possa essere generato automaticamente dall'estensione del functor derivante in GHC invece di fare affidamento sul lemma Yoneda.

Esiste qualche restrizione per l'utilizzo del derivatore in GHC rispetto a Data.Functor.Coyoneda?

+0

forse troverai [questo blogpost] (https://oleksandrmanzyuk.wordpress.com/2013/01/18/co-yoneda-lemma/) utile – Carsten

risposta

8

Buona domanda!

Coyoneda e DeriveFunctor fare cose diverse. Coyoneda crea un nuovo tipo di dati separato che risulta essere un Functor per qualsiasi scelta di argomento. DeriveFunctor genera semplicemente il codice boilerplate per i tipi che sono i functors da soli. È possibile derivare solo un'istanza Functor per i tipi per cui è possibile scrivere manualmente un'istanza del genere.

Prendere newtype Pred a = Pred (a -> Bool) come un esempio (un po 'forzato): non v'è alcuna instance Functor Pred perché Pred è contravariant nel suo parametro a, quindi DeriveFunctor non sarà in grado di aiutarvi. D'altra parte Coyoneda Pred è un Functor perché Coyoneda f è un Functor, anche se non molto utile, per qualsiasi f.

A parte, il Freer monad si presenta come un'applicazione di Free a Coyoneda.

+0

'Coyoneda Pred' è quasi isomorfo o equivalente in un certo senso a 'Const()'? Non dovresti essere in grado di estrarre alcuna informazione da nessuno di loro ... – chi

+1

@chi Sì, suppongo di sì. Puoi fabbricare un 'Coyoneda Pred' dal nulla selezionando' Void' come il tipo 'b' quantificato esistenzialmente al suo interno:' Coyoneda assurdo assurdo :: forall a. Coyoneda Pred a'. Quindi dovrebbe essere banale costruire entrambe le direzioni dell'isomorfismo. –

+0

@BenjaminHodgson se si utilizza il 'DeriveFunctor' insieme a' StandaloneDeriving', un tipico tipo di dati sembra essere in grado di diventare un funtore senza beneficiare del potere di 'Coyoneda', giusto? Conosco il nome di Freer Monad ma non lo capisco ancora del tutto. – sato

Problemi correlati