Im Gegensatz zu Maybe
, Monad
ist kein -Typ ; es ist eine typeclass .
Dasselbe gilt für andere Typklassen:
%Vor% Dabei steht *
für konkrete Typen (z. B. Bool
oder Int
), ->
für höhergeordnete Typen (z. B. Maybe
) und Constraint
für die Idee einer Typabhängigkeit. Deshalb:
Wie wir wissen, können wir keine Unterschrift wie folgt machen:
%Vor% Weil Monad
als Einschränkung verwendet werden sollte, um zu sagen, dass "dies eine Monade sein muss":
Wir machen das, weil wir wissen, dass return
nicht mit einem alten Typ m
arbeiten kann, also definieren wir das Verhalten von return
für verschiedene Typen unter dem Namen Monad
. Mit anderen Worten, gibt es keine einzige Sache, die man eine Monade nennen könnte, sondern nur ein Verhalten, das Monadisch genannt werden kann.
Aus diesem Grund haben wir diesen Typ-Constraint erstellt und gesagt, dass wir etwas als Monade vordefiniert haben müssen, um diese Funktion zu benutzen. Deshalb ist die Art von Monad
(* -> *) -> Constraint
- es ist selbst kein Typ!
Maybe
ist eine Instanz von Monad
. Dies bedeutet, dass irgendwo jemand geschrieben hat:
... und definiert, wie sich Maybe
wie eine Monade verhalten soll. Aus diesem Grund können wir Maybe
mit Funktionen oder Typen verwenden, die die Präfix-Einschränkung Monad m => ...
haben. Dies ist im Wesentlichen, wo man die Beschränkung definiert, die von Monad
angewendet wird.
Constraint
ist die Art von z.B. Show Int
, Monad Maybe
und Monoid [a]
. Grob gesagt, ist es die Art von allem, was auf der linken Seite von =>
in Typanmerkungen auftreten kann.
Jetzt seit
%Vor% und Int
sind ein Typ, d. h.
Wir können% Show
wie folgt einer funktionalen Art zuweisen
In deinem Fall passiert es einfach, dass ein Monad
ein Argument wie Maybe
, also
Tags und Links haskell type-kinds constraint-kinds