VL06: Haskell (Funktionen höherer Ordnung, Currying)

IFM 5.3 Spezielle Methoden der Programmierung

Carsten Gips, FH Bielefeld

18.05.2015

Wiederholung

Wiederholung

Motivation

Themen für heute

description

Am Ende der VL können/verstehen Sie:

Mindmap

Weitere Formen der Funktionsdefinition

Guards, guards!

bmi gewicht groesse
    | gewicht / groesse^2 <= 18.5   = "Spacko"
    | gewicht / groesse^2 <= 25.0   = "Normalo"
    | gewicht / groesse^2 <= 30.0   = "Untergross"
    | otherwise                     = "Autsch"

ghci :l bmi.hs

Verbesserung von 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"

Where!?

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

Where!? (cnt.)

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!

List Comprehensions (Listenverarbeitung)

S={2*xxN,x10}

[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]]

ghci

Beispiel zipWith-Funktion

Signatur?

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

Berechnung der Aktivierung von Neuron aj

Aktivierung von Neuron aj:

aj={1falls w0,j+a1w1,j+a2w2,j+...+anwn,j00falls w0,j+a1w1,j+a2w2,j+...+anwn,j<0

Zusammenfassung

Was haben Sie heute gehört?

Nächste Woche: Haskell (Typen und Typklassen)

Literatur zum Weiterlesen

Lernziele – Nach dieser Vorlesung sollten Sie …

Verstehen (K2)
Funktionen haben in Haskell einen Parameter
Prinzip des Currying (schrittweise partielle Applikation)
Signatur von Funktionen höherer Ordnung
Currying oft lesbarer als Lambda-Ausdrücke

Anwenden (K3)
Funktionsdefinition mit Guards und Pattern Matching
Nutzung von Where-Bindings und Let-in
Komposition von Funktionen mit .
Umgang mit map, filter, foldl, zip, …
Nutzung von Lambda-Ausdrücken

Diese Fragen sollten Sie beantworten können …

Diese Fragen sollten Sie beantworten können …

Diese Fragen sollten Sie beantworten können …