Was ist eine Constraint-in-kind-Signatur?

8

Wenn ich kind von Maybe überprüfe, bekomme ich Folgendes:

%Vor%

Wenn ich nun die Art von Monad überprüfe, bekomme ich folgendes:

%Vor%

Was ist Constraint dort und warum wird es benötigt? Warum nicht nur dieses * -> * ?

    
Sibi 08.04.2015, 08:37
quelle

2 Antworten

11

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":

%Vor%

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:

%Vor%

... 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.

    
AJFarmar 08.04.2015, 08:57
quelle
8

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.

%Vor%

Wir können% Show wie folgt einer funktionalen Art zuweisen

%Vor%

In deinem Fall passiert es einfach, dass ein Monad ein Argument wie Maybe , also

nimmt %Vor%     
chi 08.04.2015 09:00
quelle