1. Prinzipien der funktionalen Programmierung 2. Deklarationen 3. Ausdrücke 4. Muster (Patterns) 5. Typen und Datenstrukturen 6. Funktionale Programmiertechniken III.2 Deklarationen - 1 - Deklarationen len :: [Int] -> Int len [] len (kopf : rest) = = 0 1 + len rest square :: Int -> Int square x = x * x Typdeklarationen Funktionsdeklarationen Programm in Haskell: Folge von linksbündig untereinander stehenden Deklarationen III.2 Deklarationen - 2 - Deklarationen len :: [Int] -> Int len [] len (kopf : rest) = = 0 1 + len rest square :: Int -> Int square x = x * x var :: type , decl var pat = exp III.2 Deklarationen - 3 - Auswertungsstrategie square :: Int -> Int square x = x * x square (12 - 1) square 11 (12 - 1) * (12 - 1) 11 * (12 - 1) (12 - 1) * 11 11 * 11 121 strikte Auswertung (call-by-value), innen links nicht-strikte Auswertg. (call-by-name), außen links III.2 Deklarationen - 4 - Bedingte definierende Gleichungen maxi :: (Int, Int) -> Int maxi (x, y) | x >= y = x | otherwise = y var type :: , decl var pat | exp = exp = exp III.2 Deklarationen - 5 - Currying plus :: (Int, Int) -> Int plus (x, y) = x + y Currying plus :: Int -> Int -> Int plus x y = x + y var type :: , decl var pat | exp = exp = exp III.2 Deklarationen - 6 - Pattern Matching und :: Bool -> Bool -> Bool und True y = y und False y = False x var type :: , decl var pat | exp = exp = exp III.2 Deklarationen - 7 - Pattern Matching und :: Bool -> Bool -> Bool und True y = y und y = False x len :: [Int] -> Int len [] = 0 len (x : xs) = 1 + len xs Bool = "True" | "False" Liste = "[]" | Element ":" Liste III.2 Deklarationen - 8 - Lokale Deklarationen roots :: Float -> Float -> Float -> (Float, Float) roots a b c = ((-b - d)/e, (-b + d)/e) where where {d d= =sqrt sqrt(b*b b*b -- 4*a*c); 4*a*c e e= =2*a} 2*a locdecls { var decl :: , ; type } decl var pat | exp = exp = exp where locdecls III.2 Deklarationen - 9 -