2017-01-12 6 views
2

ich Haskell/Category theory bin Lesen und hier ist die definition of monad aus diesem Artikel:Gibt es bei allen Monad-Instanzen in Haskell nur unterschiedliche Möglichkeiten für die Zuordnung von Hask zu Hask?

A Monade eine spezielle Art von Funktor ist, aus einer Kategorie zu gleichen Kategorie, die einige zusätzliche Struktur unterstützt. Also, bis Definitionen. A ist ein monadisch Funktors M: C-> C, zusammen mit zwei morphisms für jeden Objekt X in C:

Einheit: X -> M (X)

JOIN: M (M (X)) -> M (X)

Wie ich es verstehe, in Haskell return entspricht unit. Aber mit return kann ich schreiben:

x :: [Int] -- x is a member of Lst category 
x = return 5 

und dies gilt Code in Haskell. Nun, wie Sie sehen können, ist 5 hier kein Mitglied von Lst, aber return funktioniert dafür.

Also, ich denke, dass Lst nicht С ist von M: C-> C. Aber wer dann?

Vielleicht ist die richtige Antwort Hask, aber ich bin mir nicht sicher, dass „Funktors aus einer Kategorie zu seinem Unter“ ist das gleiche wie „Funktor von einer Kategorie zur gleichen Kategorie“.

+0

Was ist 'Hask'? – Thilo

+0

Es ist aus „Haskell/Categry Theorie“: „Die Hauptkategorie wir sie mit in diesem Artikel würden über Hask ist, die Haskell-Typen als Objekte und Haskell Funktionen wie morphisms behandelt ...“ – azaviruha

+1

Die 'M: C -> C "entspricht" m "in der Klasse Monad m wobei .." und "C" ist die Kategorie "Hask", aber im Kontext "..: C -> C" bezieht sich "C" auf ein Objekt von 'C', was in diesem Fall ein Typ ist. Ich denke, es ist "richtiger", "M: Obj (C) -> Obj (C)" zu schreiben. – user2407038

Antwort

7

Dies ist ein allgemeiner Punkt der Verwirrung und Sie haben die Frage klar genug gestellt, damit sie beantwortbar ist.

Ich bin nicht sicher, dass „Funktors von Kategorie zu, es ist die Subkategorie“ ist das gleiche wie „Funktor aus der Kategorie zu der gleichen Kategorie“.

Es ist nicht das Gleiche. Ein Funktor besteht aus vier Daten: einer Quellkategorie C, einer Zielkategorie D, einer Zuordnung von Objekten von C zu Objekten von D und einer Abbildung von Morphismen von C zu Morphismen von D, die einige Bedingungen erfüllen. Wenn Sie D ändern, ändern Sie den Funktor.

Wenn wir jedoch einen Funktor definieren, haben wir oft eine Auswahl in der Kategorie D.Ich schließe aus Ihrer Frage, dass Lst ist eine Unterkategorie von Hask, deren Objekte Arten von Form [a], obwohl ich nicht sicher bin, was die Morphismen von Lst sein sollen. Wir konnten [] von einem dieser beiden Formen einen Funktor definieren:

  1. []: Hask ->Lst (dh die Zielkategorie von [] ist Lst)

  2. []: Hask ->Hask (dh ist die Zielkategorie von []Hask)

Das sind technisch verschiedene Funktoren, und wir müssen eine Wahl treffen. In diesem Zusammenhang ist die richtige Wahl Wahl 2. Wir die Quell- und Zielkategorien müssen gleich sein, weil wir [] mit dem Ausgang der [], in join anwenden müssen. So C = Hask und M = [].

Im Allgemeinen erweist es sich als selten nützlich, Kategorien wie Lst zu berücksichtigen, die als Abbild eines Typkonstruktors definiert sind. Ich bin mir nicht sicher, woher diese (sehr verbreitete) Idee kommt. Ich empfehle Ihnen, die Idee "der Kategorie Lst" beiseite zu legen. Nur eine Kategorie reicht für jetzt!

Für Analogie betrachten die Funktion, die Quadrate eine reelle Zahl f (x) = x^2. Wir können dies als eine Funktion f: R -> R von den reellen Zahlen zu den reellen Zahlen sehen, obwohl f (x) nur nichtnegative reelle Werte annimmt. Das Ziel von f muss nicht gleich dem Bild von f sein (die Werte, die tatsächlich von f auf seinen Eingabewerten erreicht werden).

+0

Vielen Dank, Ihre Antwort ist sehr hilfreich! – azaviruha

0

Eine Monade ist definitionsgemäß ein Endofunktor. Die Typenklasse Functor stellt eigentlich endofunctors dar, da Instanzen von Functor für Typkonstruktoren definiert sind, bei denen es sich um Funktionen auf Typenebene handelt, die einen Typ annehmen und einen neuen Typ zurückgeben (dh sie haben die Art * -> *).

return :: Monad m => a -> m a, so ist es nicht verwunderlich, dass returnInt einen Wert vom Typ annehmen kann und einen Wert vom Typ [Int] zurückzukehren.

Verwandte Themen