home Funktionale Programmierung: Einfache Datentypen Prof. Dr. Uwe Schmidt FH Wedel

Einfache Datentypen

weiter

weiter

Wahrheitswerte

Bool
Boolesche Werte
 
data Bool = False | True
weiter
Operatoren
&&, ||, not
weiter
Funktionsdefinition
verschiedene Varianten
weiter
.1
and      :: Bool -> Bool -> Bool
and x y  = x && y
 
exOr     :: Bool -> Bool -> Bool
exOr x y = (x || y) && not ( x && y )
weiter
.2
Muster
and  True  y = y
and  False y = False
 
exOr True  y = not y
exOr False y = y
weiter
.3
Wahrheitstabelle
and  True  True  = True
and  True  False = False
and  False True  = False
and  False False = False
 
exOr True  True  = False
exOr True  False = True
exOr False True  = True
exOr False False = False
weiter
.4
if
and  x y = if x then y else False
 
exOr x y = if x then not y else y
weiter
.5
case
and x y =
  case x of
  True  -> y
  False -> False
 
exOr x y =
  case x of
  True  -> not y
  False -> y
weiter
?
Sind .1 bis .5 äquivalent?
weiter
Regelschreibweise "nur" syntaktischer Zucker
aber die Lesbarkeit wird verbessert
weiter
"pattern matching", Mustervergleich ist noch allgemeiner möglich.
weiter
Mustervergleich in Funktionen wird intern zurückgeführt auf case-Ausdrücke
weiter
Gleichheitstest
(==)    :: Bool -> Bool -> Bool
x == y  =  (x && y) || (not x && not y)
 
(/=)    :: Bool -> Bool -> Bool
x /= y  =  not (x == y)
weiter
merke
== ist auch auf anderen Typen definiert, aber nicht auf allen.
merke
/= ist eine allgemein gültige Definition
weiter
Lösung
Typklassen
weiter
Literatur
weiter
Eq
eine Typklasse für Gleichheitstest
 
class Eq a where
  (==) :: a -> a -> Bool
  (/=) :: a -> a -> Bool
weiter
merke
In Java oder C++: Eine Schnittstelle oder abstrakte Klasse
weiter
Eq für Bool
instance Eq Bool where
  x == y        =  (x && y) || (not x && not y)
  x /= y        =  not (x == y)
weiter
Eq
mit default-Definiton
 
class Eq a where
  (==)   :: a -> a -> Bool
  (/=)   :: a -> a -> Bool
 
  x /= y =  not (x == y)
weiter
gut
Bool braucht nur noch == zu definieren.
weiter
Ord
eine Typklasse für eine totale Ordnung
weiter
Voraussetzung
Es gibt einen Gleichheitstest
 
class Eq a => Ord a where
  (<), (<=), (>=), (>)  :: a -> a -> Bool
  max, min              :: a -> a -> a
  compare               :: a -> a -> Ordering
 
  x <= y     = (x < y) || (x == y)
  x >= y     = (x > y) || (x == y)
  x > y      = not (x <= y)
 
  min x y    = if x < y then x else y
  max x y    = if x > y then x else y
 
data Ordering = LT | EQ | GT
weiter
gut
Nur < muss für Bool definiert werden
weiter
Ord für Bool
instance Ord Bool where
  False < False = False
  False < True  = True
  True  < False = False
  True  < True  = False
oder
instance Ord Bool where
  False < True  = True
  _     < _     = False
weiter

weiter

Ganze Zahlen

Int
wie int in C
maschinenabhängiges Intervall
weiter
Definition
konzeptionell
 
data Int = MinInt | ... | 0 | ... | MaxInt
weiter
Integer
der Bereich der ganzen Zahlen ohne Bereichsbeschränkung
weiter
Definition
konzeptionell
 
data Integer = ... | -| -| 0 | 1 | 2 | ...
weiter
Operatoren
+, -, *,
^            -- Exponentiation
div, mod,
abs, negate,
 
==, /=,      -- Vergleiche
>, >=, <=, <
weiter
Syntax
für Funktionsnamen
 
f x y entspricht x `f` y
Infix-Notation für Funktionsnamen
weiter
Syntax
für Operatoren
 
x op y entspricht (op) x y
Präfix-Notation für Operatoren
weiter
Beispiel
x `div` y

oder

x `mod` y

weiter
eigene Operatoren
(&&&)   :: Int -> Int -> Int
x &&& y
  = if x < y then x else y
weiter
x &&& y entspricht (&&&) x y
weiter
Überladen
Beispiel: Vergleiche
 
(==) :: Int  -> Int  -> Bool
(==) :: Bool -> Bool -> Bool
     .
     .
     .
(==) ::  t   ->  t   -> Bool
weiter
Typvariable
immer in Kleinbuchstaben
weiter
Überladen
wird vom Haskell-Typsystem behandelt
einheitliche Strategie:
keine Unterschiede zwischen selbstdefinierten und vordefinierten Operatoren
weiter
Wächter
guards
für allgemeinere Regelschreibweise mit beliebigen Bedingungen, nicht nur Mustervergleich
weiter
Beispiel max
max x y
  | x < y     = y
  | otherwise = x
 
-- mit
 
otherwise     :: Bool
otherwise     =  True
Syntax
fct x1 x2 ... xn
  | g1        = e1
  | g2        = e2
    ...
  | otherwise = e
 
entspricht
 
fct x1 x2 ... xn
  if g1
  then e1
  else
  if g2
  then e2
  else
  ...
  else e
weiter

weiter

Zeichen

Char
Zeichen
weiter
Definition
konzeptionell
 
data Char = Char0 | Char1 | ... | CharMax
weiter
Literale
'a', ...  -- wie in C
'\t', '\n', '\\', '\''
weiter
Konversion
ord :: Char -> Int
chr :: Int  -> Char
weiter
Eq
Gleichheitstest
 
instance Eq Char where
  x == y        = ord x == ord y
 
instance Ord Char where
  x < y      = ord x < ord y
weiter

weiter

Fließkomma-Zahlen

Float und Double
Fließkommazahlen mit einfacher und doppelter Genauigkeit
weiter
Operatoren
+, -, *, /, ^, **,
==, /=, >=, >, <=, <,
abs, min, max, ...
fromInt, fromInteger
weiter

Letzte Änderung: 24.09.2019
© Prof. Dr. Uwe Schmidt
Prof. Dr. Uwe Schmidt FH Wedel