Muster und Guards

[Back]

Guards werden immer dann verwendet, wenn, abhängig von boolschen Bedingungen Berechnungen ausgeführt werden sollen. Im Prinzip handelt es sich um eine Fallunterscheidung, wobei nicht explizit abgeprüfte Fälle durch den otherwise Fall abgefangen werden. Eine Entsprechung der der if - then - else Klausel in imperativen Sprachen ist naheliegend.
Ein Beispiel ist die Berechnung des Maximums zweier Zahlen. Die Gleichheit wird dabei einer Relation zugeordnet.

01  max2 a b :: Int -> Int ->  
02    
03  max2 a b  
04         | a <=  b      = b
05         | a >   b      = a

Ein weiteres Beispiel wäre die Ermittlung des Vorgängers einer Zahl. Mit Guards würde dieses Programm wie folgt lauten :

01  vorgaenger1 :: Int -> Int  
02    
03  vorgaenger1 n  
04         | n == 0    = 0
05         | otherwise = n -1

Allerdings wäre hier eine andere Möglichkeit besser. Die Verwendung von Mustern. Die Muster müssen dabei alle Fälle abdecken, die Funktion erschöpfend sein. Da (n + 1) nur eine natürliche Zahl sein kann, werden durch diese Definition tatsächlich alle natürlichen Zahlen abgedeckt.

01  vorgaenger2 :: Int -> Int  
02    
03  vorgaenger2  0      = 0  
04  vorgaenger2 (n + 1) = n

Diese Methode bezeichnet man als Musteranpassung (Pattern Matching). Musteranpassung wird in der Regel einer Fallunterscheidung vorgezogen

[Übungen]