2017-02-08 1 views
0

Bitte beachten Sie, dass ich online (in stackoverflow und Hoogle) geschaut habe, ob ich etwas zu diesem Thema finden könnte!Bedeutung von => und (Ord a)

Ich habe mich selbst durch ein "learn yourself haskell" gearbeitet und es gibt zwei Dinge, über die ich ziemlich oft gestolpert bin, die ich nicht wirklich verstehe. Die Verwendung von => und (Ord a) in mehreren wichtigen Funktionen.

Als Beispiel:

max :: (Ord a) => a -> a -> a 

und ist die Verwendung von "Bestellung" das gleiche wie (Ord a), wie in:

compareWith :: Int -> Ordering 

Danke, dass Sie Ihre Zeit nehmen und mir helfen mit dieser (wahrscheinlich) simplen Frage!

+0

Sie können * fast * denken '(=>) 'als Operator des Typs' Constraint -> * ', außer dass ein Constrained-Typ kein gültiger Ausdruck außerhalb einer Typ-Annotation ist. (Auch "=>" "nimmt" entweder einen einzelnen "Constraint" oder einen "Tupel" von "Constraint's".) – chepner

Antwort

6

Das Symbol => wird zum Erstellen von Klassenbeschränkungen für eine Funktion verwendet. Im Beispiel max bedeutet dies, dass alle Parameter vom Typ a die Typklasse Ord implementieren müssen.

Betrachten wir die Implementierung von max

max :: (Ord a) => a -> a -> a 
max x y = if x < y then y else x 

Das einzige, was wir wissen, über x und y ist, dass sie die Ord typeclass zu erfüllen haben. Das wiederum ermöglicht es uns, die < Funktion zum Vergleich zu verwenden, deren Signatur:

(<) :: Ord a => a -> a -> Bool 

Wenn Sie die Ord a Einschränkung aus der Definition von max wegzulassen, dann wäre es nicht kompilieren, weil der Körper von max wäre nicht in der Lage, die Vergleichsfunktion zu verwenden.

+0

Hier ist der Link zu [Quelle] (https://www.stackage.org/haddock/lts -7.19/ghc-prim-0.5.0.0/src/GHC-Klassen.html # Ord). – wizzup

2

Der Teil (Ord a) => ist eine Typenzwangsbedingung, die angibt, dass a ein ordinaler Typ ist (es kann bestellt werden).

Sie können max :: (Ord a) => a -> a -> a als lesen:

wo a eine Ordnungstyp, "max" dauert 2 Argumente vom Typ a und kehrt geben Sie einen