Sichtbarkeit von Definitionen Sichtbarkeit von Definitionen Lokale

Werbung
Sichtbarkeit von Definitionen
Sichtbarkeit von Definitionen
• die Definitionen auf der obersten Ebene eines Skript in Haskell haben das
ganze Skript als Gültigkeitsbereich (Skopus), d.h. sind ‘global’ im ganzen
Skript sichtbar
• wechselseitige Bezugnahme in rekursiven Definitionen ist möglich
• Beispiel:
isOdd, isEven :: Int -> Bool
isOdd n
| n<= 0
= False
| otherwise = isEven(n - 1)
...
WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 14. November 2006
Beispiel cont.:
...
isEven n
| n < 0
= False
| n == 0
= True
| otherwise = isOdd(n - 1)
Main> isEven 5
False
Main> isOdd 5
True
149
WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 14. November 2006
Lokale Definitionen
Lokale Definitionen
Motivation:
• Beispiel:
eine Funktion addPairwise’, die korrespondierende Elemente zweier
Zahlenlisten addiert und – falls eine Liste keine Elemente mehr hat – den
aktuellen Rest der anderen an die Liste der Paarsummen anhängt
• Vermeiden wiederholter Berechnungen
• klarer strukturierter Code
WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 14. November 2006
150
151
WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 14. November 2006
152
Lokale Definitionen
Lokale Definitionen
mögliche Lösung für addPairwise’:
Was sind Schwachpunkte dieser Lösung?:
addPairwise, addPairwise’ :: [Int] -> [Int] -> [Int]
• ...
addPairwise intList1 intList2
= [ x+y | (x,y) <- zip intList1 intList2]
• ...
addPairwise’ intList1 intList2
= addPairwise
(take (min (length intList1) (length intList2)) intList1)
(take (min (length intList1) (length intList2)) intList2)
++
drop (min (length intList1) (length intList2)) intList1
++
drop (min (length intList1) (length intList2)) intList2
WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 14. November 2006
• ...
153
Lokale Definitionen in Haskell: mit Konstrukt where
154
Lokale Definitionen in Haskell: mit Konstrukt where
• Syntax des Konstrukts where:
clauseOfFunctionDefinition
where
functionDefinition1
functionDefinition2
...
functionDefinitionn
WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 14. November 2006
• Reihenfolge der Definitionen in where-Klausel ist irrelevant
• ein Wert kann verwendet werden, bevor er definiert ist
• analog zu Unabhängigkeit von Reihenfolge bei Definition in Skripten
(n>=1)
WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 14. November 2006
155
WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 14. November 2006
156
where in Haskell
where in Haskell
• Variante mit Pattern match mit Paaren:
• Beispiel bei addPairwise’
addPairwise’ intList1 intList2
= front ++ rear
where
minLength = min (length intList1) (length intList2)
front
= addPairwise (take minLength intList1)
(take minLength intList2)
rear
= drop minLength intList1
++ drop minLength intList2
addPairwise’ intList1
= front ++ rear
where
minLength
=
front
=
rear
=
(front1, rear1) =
(front2, rear2) =
intList2
min (length intList1) (length intList2)
addPairwise front1 front2
rear1 ++ rear2
splitAt minLength intList1
splitAt minLength intList2
• Bemerkung: für die Anordnung lokaler Definitionen gilt die Layout-Regel
WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 14. November 2006
157
where in Haskell
WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 14. November 2006
158
where in Haskell
• mit where können auch lokale Hilfsfunktionen definiert werden
• Beachte: der Skopus der definierten Funktionen ist nur die Klause, bei der
where anschliesst
• Beispiel: Summation mit Akkumulator
sum :: Num a => [a] -> a
sum [] = sum’ [] 0 -- falsch, sum’ hier NICHT sichtbar !
sum ys = sum’ ys 0
where
sum’ [] total = total
sum’ (x:xs) total = sum’ xs (total+x)
sum :: Num a => [a] -> a
sum ys = sum’ ys 0
where
sum’ [] total = total
sum’ (x:xs) total = sum’ xs (total+x)
WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 14. November 2006
159
WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 14. November 2006
160
Herunterladen