www.jammni.de

Logo - Kleiner Drache

Logo - Drache2.1. Funktionen

Home >> Tutorials >> Haskell−Tutorial
 

Eine typische Haskell-Funktion

Schauen wir uns mal das Beispiel der Funktion square etwas genauer an. Zur Erinnerung hier noch einmal die Funktion:
 
 
Listing 1.1 - Square.hs:
12:   square :: Int -> Int
13:   square n = n * n

  In Zeile 12 wird zunächst die Funktion deklariert. Zuerst wird dabei der Name angegeben. Dabei ist zu beachten, dass der Funktionsname mit einem Sonderzeichen (naja, nicht allen, aber einigen) oder einem Kleinbuchstaben beginnen muss. Bei Funktionsaufrufen ist dann die exakte Schreibweise wichtig - Groß-/Kleinschreibung ist also wichtig!!.
Danach folgen zwei Doppelpunkte (::) und anschließend die Eingabeparameter sowie Rückgabewerte. Die Eingabeparameter können entweder durch einen Pfeil (->) oder durch ein Komma getrennt werden. Dabei sind mit Komma getrennte Variablen zu Tupeln zusammenzufassen. Selbiges gilt für die Rückgabewerte. Und die Eingabeparameter werden auch nach dem selben System von den Rückgabewerten getrennt.
Als nettes Feature können mehrere Parameter oder Rückgabewerte noch geklammert werden. Das wird dann Tupel genannt und dient einfach nur der besseren Übersichtlichkeit.
Doch zuerst mal nen paar Beispiele samt Funktionsrumpf:

 
Listing 2:
1:   -- Exklusives Oder, die Funktion bekommt zwei Bools als Eingabewert und gibt einen Bool zurück
2:   exOr :: Bool -> Bool -> Bool
3:   exOr x y = (x || y) && not (x && y)
4:   
5:   -- selbiges, diesmal mit Gruppierung und Kommas - ist doch schöner, oder?
6:   exOr2 :: (Bool, Bool) -> Bool
7:   exOr2 (x, y) = (x || y) && not (x && y)
8:   
9:   -- bekommt drei Eingabeparameter als zwei Tupel ineiander verschachtelt übergeben
10:   addi :: ((Int, Int), Int) -> Int
11:   addi ((a, b), c) = a + b + c

  Als Parameter können natürlich nicht nur einzelne Werte angegeben werden, sondern auch Listen. Listen sind das Pendant zu Arrays in anderen Programmiersprachen und fassen mehrere Werte in einer Variablen zusammen. Dazu werden einfach eckige Klammern um einen Datentyp oder um ein Tupel gesetzt. Beliebige Verschachtelungen sind dabei erlaubt. Und zur Veranschaulichung gibts hier wieder nen paar Beispiele:

 
Listing 3:
1:   -- nimmt zwei Listen entgegen (vom Typ a und b [quasi generische Typen])
2:   -- und gibt (a, b)-Tupel zurück (vielleicht gibts auch mal ne Implementation ;-))
3:   zip :: [a] -> [b] -> [(a, b)]

 

Funktionsrumpf

Beim Funktionsrumpf wird ebenfalls zuerst der Funktionsname angegeben. Danach folgen die Variablennamen für die Eingabeparameter mit denen man später nach dem = arbeitet. Dabei sind die Klammern für Tupel entsprechend der Funktionsdeklaration zu setzen. Listenklammern werden selbstverständlich weggelassen.
Die Variablen selbst werden durch Leerzeichen getrennt, bei Tupeln jedoch werden sie durch ein Komma getrennt.