2015-04-08 6 views
8

Wenn ich die kind von Maybe inspizieren bekomme ich diese:Was ist Constraint in Art Signatur

λ> :k Maybe 
Maybe :: * -> * 

Nun, wenn ich die Art von Monad ich dieses inspizieren:

λ> :k Monad 
Monad :: (* -> *) -> Constraint 

Was Constraint ist da und warum wird es gebraucht? Warum nicht einfach * -> *?

Antwort

11

Im Gegensatz zu Maybe ist Monad kein Typ; es ist eine typeclass.

Das gleiche gilt für andere typeclasses:

Num :: * -> Constraint 
Functor :: (* -> *) -> Constraint 
Bifunctor :: (* -> * -> *) -> Constraint 

Wo * Betontypen (wie Bool oder Int) darstellt, -> repräsentieren höhere kinded Typen (wie Maybe) und Constraint repräsentiert die Idee eine Typbeschränkung Aus diesem Grund:


Wie wir wissen, dass wir nicht eine Signatur wie diese machen kann:

return :: a -> Monad a -- This is nonsense! 

Da Monad sollte als Einschränkung verwendet werden, das heißt, ‚das sein muss eine Monade zur Arbeit ':

return :: (Monad m) => a -> m a 

wir tun dies, weil wir, dass return weiß nicht, auf jedem alten Typ m arbeiten können, so dass wir de fein das Verhalten von return für verschiedene Typen unter dem Namen Monad. Mit anderen Worten, gibt es keine einzige Sache, die eine Monade genannt werden kann, sondern nur ein Verhalten, das Monadisch genannt werden kann.

Aus diesem Grund haben wir diese Typabhängigkeit erstellt und gesagt, dass wir etwas als Monade vordefiniert haben müssen, um diese Funktion zu verwenden. Deshalb ist die Art von Monad(* -> *) -> Constraint - es ist selbst kein Typ!


Maybe ist eine Instanz Monad. Dies bedeutet, dass irgendwo jemand geschrieben hat:

instance Monad Maybe where 
    (>>=) = ... -- etc 

... und definiert, wie Maybe als 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 definiert man die Constraint von Monad angewendet.

8

Constraint ist die Art von z.B. Show Int, Monad Maybe und Monoid [a]. Grob ist es die Art von allem, was auf der linken Seite von => in Typ Anmerkungen auftreten kann.

Da nun

Show Int :: Constraint 

und Int ist ein Typ, dh

Int :: * 

wir eine funktionelle Art Show zuweisen können als

Show :: * -> Constraint 
      ^-- the result kind 
     ^-- the kind of Int 

In Ihrem Fall folgt es passiert einfach dass ein Monad Argument wienimmt, also

Maybe Int :: * 
Maybe :: * -> * 
Monad :: (* -> *) -> Constraint 
        ^-- the result kind 
     ^-- the kind of Maybe 
Verwandte Themen