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