Wie können Sie die ersten Elemente einer Liste auswählen?
Wie können Sie die ersten Elemente einer Liste entfernen?
Was sind “List Comprehensions”?
Was ist der Unterschied zwischen den beiden folgenden Aufrufen?
zip [1 .. 5] ["one", "two", "three"]
[(x, y) | x <- [1 .. 5], y <- ["one", "two", "three"]]
Was bedeutet “Pattern Matching” im Zusammenhang mit der Funktionsdefinition?
Am Ende der VL können/verstehen Sie:
where
definierenMindmap
bmi gewicht groesse
| gewicht / groesse^2 <= 18.5 = "Spacko"
| gewicht / groesse^2 <= 25.0 = "Normalo"
| gewicht / groesse^2 <= 30.0 = "Untergross"
| otherwise = "Autsch"
Pattern Matching: Parameter passt zu Form (Destruktion)
Guards: Lesbare Form eines if
-Statements
=> Wichtig: Letzter Fall immer mit otherwise
ghci :l bmi.hs
bmi
Was stört Sie an dieser Version von bmi
?
bmicalc gewicht groesse
| gewicht / groesse^2 <= 18.5 = "Spacko"
| gewicht / groesse^2 <= 25.0 = "Normalo"
| gewicht / groesse^2 <= 30.0 = "Untergross"
| otherwise = "Garfield"
bmicalc gewicht groesse
| bmi <= 18.5 = "Spacko"
| bmi <= 25.0 = "Normalo"
| bmi <= 30.0 = "Untergross"
| otherwise = "Garfield"
where bmi = gewicht / groesse^2
=> Zusammenfassung der Berechnung in lokaler Variable
bmicalc gewicht groesse
| bmi <= skinny = "Spacko"
| bmi <= normal = "Normalo"
| bmi <= fat = "Untergross"
| otherwise = "Garfield"
where bmi = gewicht / groesse^2
skinny = 18.5
normal = 25.0
fat = 30.0
=> Einrückung wichtig!
[x*2 | x <- [1..10]]
Prelude> [x*2 | x <- [1..10], x*2>5]
Prelude> let xs = ["A", "B", "C"]
Prelude> [a ++ "-" ++ b | a <- xs, b <- xs]
Prelude> [a ++ "-" ++ b | a <- xs, b <- xs, a < b]
Prelude> [(a,b) | a <- [1..3], b <- [1..a]]
a <- xs
bedeutet “Nimm der Reihe nach alle Elemente aus xs
und binde sie an a
”[a+b | (a,b) <- xs]
ghci
zipWith
-FunktionSignatur?
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
Definition?
zipWith _ [] _ = []
zipWith _ _ [] = []
zipWith f (x:xs) (y:ys) = f x y : zipWith f xs ys
Anwendung:
Prelude> zipWith (+) [4,2,5,6] [2,6,2,3]
Prelude> zipWith max [6,3,2,1] [7,3,1,5]
ghci
Aktivierung von Neuron :
Funktionsdefinition mit Guards, mit Where-Bindings und Let-in
Funktionen haben in Haskell genau einen Parameter
Currying: Partielle Anwendung einer Funktion auf einen Parameter liefert Funktion mit restlichen Parametern
Funktionskomposition mit .
Funktionen höherer Ordnung: Funktionen als Parameter oder Rückgabe
=> Beispiele: map
, filter
, foldl
(“reduce”)
Anonyme Funktionen mit Lambda-Ausdrücken
Nächste Woche: Haskell (Typen und Typklassen)
Miran Lipovaca: “Learn You a Haskell for Great Good!”, learnyouahaskell.com
O’Sullivan, Stewart, Goerzen: “Real World Haskell”, book.realworldhaskell.org
Block, Neumann: “Haskell Intensivkurs”, Springer, 2011
.
map
, filter
, foldl
, zip
, …
Worin besteht der Unterschied zwischen Guards und Pattern Matching?
Worin besteht der Unterschied zwischen Where-Bindings und Let-in-Ausdrücken?
Erklären Sie Currying an einem Beispiel. Worin liegt die praktische Bedeutung von partieller Applikation?
Was sind Lambda-Ausdrücke?
Erklären Sie foldl
an einem Beispiel.
Was bedeuten die folgenden Code-Schnipsel?
map (+ 1) [1, 2, 3]
filter odd [1, 2, 3, 4, 5]
foldl1 (+) 0 [1 .. 3]
Schreiben Sie im folgenden Code-Schnipsel fibNth
mit Hilfe von Funktionskomposition um:
lazyFib x y = x:(lazyFib y (x + y))
fib = lazyFib 1 1
fibNth x = head (drop (x - 1) (take (x) fib))
Definieren Sie eine Funktion fib5th
durch partielle Applikation.