2016-06-06 6 views
5

Nach dem Studium der Kategorientheorie basierend auf MacLane, Awodey und Spivak Bücher, versuche ich zu verstehen, freie/operative Monade in Haskell.Coyoneda und Ableiten Functor in Haskell

Wir können eine Monade nur aus einem Datentyp erhalten, indem wir Control.Monad.Free verwenden, nachdem wir sie in einen Funktor mit Data.Functor.Coyoneda umgewandelt haben, der auf dem mathematischen Hintergrund namens Yoneda Lemma basiert.

Aber ich bin nicht vollständig im Verständnis der Funktor kann automatisch durch die Ableitung Funktor Erweiterung in GHC statt auf Yoneda Lemma beruhen.

Gibt es Einschränkungen hinsichtlich der Verwendung des Ableitfunktors in GHC im Vergleich zu Data.Functor.Coyoneda?

+0

vielleicht finden Sie [diese Blogpost] (https://oleksandrmanzyuk.wordpress.com/2013/01/18/co-yoneda-lemma/) hilfreich – Carsten

Antwort

8

Gute Frage!

Coyoneda und DeriveFunctor verschiedene Dinge tun. Coyoneda erstellt einen neuen, separaten Datentyp, der zufällig eine Functor für eine beliebige Argumentwahl ist. DeriveFunctor generiert einfach den Boilerplate-Code für Typen, die sind Funktoren von selbst. Sie können nur eine Functor Instanz für Typen ableiten, für die Sie eine solche Instanz manuell schreiben könnten.

Nehmen newtype Pred a = Pred (a -> Bool) als (etwas gekünstelt) Beispiel: Es gibt keine ist instance Functor Pred weil Pred ist kontra in seinen a Parametern, so DeriveFunctor nicht in der Lage sein, Ihnen zu helfen. Andererseits ist Coyoneda Pred ein Functor, weil Coyoneda f ein Functor ist, wenn auch kein sehr nützliches für irgendeinen f.

Nebenbei ergibt sich die Freer monad als eine Anwendung von Free bis Coyoneda.

+0

Ist 'Coyoneda Pred' fast isomorph oder gleichwertig in gewisser Hinsicht zu 'Const()'? Sie sollten nicht in der Lage sein, irgendwelche Informationen von ihnen zu extrahieren ... – chi

+1

@chi Ja, nehme ich an. Sie können einen "Coyoneda Pred" aus dem Nichts herstellen, indem Sie 'Void' als den existentiell quantifizierten' b' Typ darin auswählen: 'Coyoneda absurd absurd :: forall a. Coyoneda Pred a'. Dann sollte es trivial sein, beide Richtungen des Isomorphismus zu konstruieren. –

+0

@BenjaminHodgson Wenn man 'DeriveFunctor' zusammen mit' StandaloneDeriving' verwendet, scheint ein typischer Datentyp ein Funktor zu werden, ohne von der Kraft von 'Coyoneda' zu profitieren, oder? Ich kenne den Namen der Freer Monade, aber noch nicht vollständig verstanden. – sato

Verwandte Themen