sind in Haskell Typklassen, dh Kollektionen von Typen, die durch einen gemeinsamen Satz von Operationen ausgezeichnet sind.
Idee aus der OO-Welt, aber in Haskell:
"`Klasse"' = Familie von Typen, nämlich Definitionshierarchie
instance
=
Typ
subclass
=
class, dh Menge von Typen
quicksort :: Ord a => [a]->[a]
\--/
Kontextklausel: a muß Instanz von Ord sein (mittelbar)
class Eq a
where (==), (/=) :: a->a->Bool
x/=y = not (x==y) - dh default für /=
Beispiel für Unterklasse von Eq ist Ord, die zu ``=='' noch die Operationen ``<, <=, >=, >'' sowie die Funktionen ``min, max'' (und noch eine Funktion ``compare'' die ein symbolisches Ergebnis liefert) definiert.
Beispiel von Instanzen von Eq gibt's massenhaft, zB Int.
Beispiel: benutzerdefinierter Datentyp als Instanz von Eq:
-------------------old defs do not support "=":
data PrimaryColour = Yellow | Red | Blue
--------------------------as is shown by:
{-
Main> Yellow == Blue
ERROR: PrimaryColour is not an instance of class "Eq"
-}
-------------so make new type an instance of class Eq:
data PrimaryColour = Yellow | Red | Blue
instance Eq PrimaryColour
where Yellow == Yellow = True
Red == Red = True
Blue == Blue = True
_ == _ = True
---------------------------which allows:
{-
Main> Yellow == Blue
False
-}
-------------------this can be done more simply:
data PrimaryColour = Yellow | Red | Blue deriving Eq
-----------------------which gives the same:
{-
Main> Yellow == Blue
False
Main> Yellow /= Blue
True
-}
-----but other defs of "==" could be useful for colour blinds:
data PrimaryColour = Yellow | Red | Blue
instance Eq PrimaryColour
where _ == _ = True
------------------------------giving:
{-
Main> Yellow == Blue
True
-}
Beispiel: Definition einer Klasse und zweier Instanzen
-------------------now define your own classes:
class Mail m
where giveAdr:: m->String
setAdr:: String->m->m
existsAdr:: m->Bool
existsAdr x = (giveAdr x /= "") - default
data SimpleLetter a = SL String a - hat eine Adresse
instance Mail (SimpleLetter a)
where giveAdr (SL s _) = s
setAdr s (SL s' x) = (SL s x)
data BroadcastLetter a = BC [String] a - hat Liste von Adressen
clearAdr:: (BroadcastLetter a)->(BroadcastLetter a)
clearAdr (BC ss x) = BC [] x
instance Mail (BroadcastLetter a)
where giveAdr (BC [] _) = ""
giveAdr (BC (s:ss) _) = s
setAdr s (BC ss x) = BC (s:ss) x
-----------------------------examples:
{-
Main> existsAdr (SL "Grete" (25, "Now", 1997))
True
Main> giveAdr(setAdr "Gustav" (setAdr "Franz"
(SL "Grete" (25, "Nov", 1997))))
"Gustav"
Main> giveAdr (clearAdr (BC ["Grete"] (25, "Nov", 1997)))
""
Main> existsAdr (clearAdr (BC ["Grete"] (25, "Nov", 1997)))
False
-}