Allgemeinste Typen (Haskell)

Aus Infostudium Wiki

Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Aufgabe 3 (Blatt 11)

a)

Gegebene Funktion: f x y z = f z y x

f ist die Funktion. x, y und z sind Parameter.

Da Haskell eigentlich nur einen Parameter kennt, kann man die Funktion in mehrere Funktionen aufsplitten. So werden aus Parameter Funktionen. Die Grenze zwischen Parametern und Funktionen verschwimmt in Haskell also.

Von links nach rechts: a für x, b für y, z muss folglich wieder a sein, und herauskommen kann irgendwas, also c.

Lösung:

f :: a -> b -> a -> c
f x y z = f z y x

b)

g x = if True then \y -> y else \z -> head x
Die Funktion head ist wie in Aufgabe 1 definiert

Bei dieser Funktion gibt es eine Hürde, die erkannt werden muss. Haskell überprüft den Quelltext beim Start. Obwohl Haskell wegen dem "if True" niemals in den "else"-Teil kommen würde, weiß Haskell trotzdem den Rückgabetyp, da Haskell vorraussetzt, dass der Rückgabetyp immer der selbe ist. Aufgrund des head x also weiß Haskell, dass wenn man [a] als Typ für den Parameter x einsetzt die Zuordnung immer a -> a sein muss, egal ob nun die Zuordnung \y -> y oder \z -> head x genommen wird. Dass x eine Liste sein muss, folgt aus head x.

Lösung:

g :: [a] -> a -> a

Info:

Backslash steht in Haskell für Lambda. Hier eine kurze Erklärung dazu:

f = \(x, y) -> (x * x + 2 * y)

"f ist diejenige Funktion, die den Argumenten x und y den Wert x * x + 2 * y zuordnet".

Wichtig:

Haskell verlangt, dass alle Lösungsmöglichkeiten den gleichen Typ haben.

c)

h [] z = z
h (x:y) z = x ++ h y z

Eine Funktion, zwei Parameter, ein Rückgabewert.

Auf den erste Blick nichts besonderes. Jedoch zwei Hürden sind bei dieser Aufgabe zu nehmen. Man steckt wie üblich für die beiden Parameter die Typen a und b rein. Durch den rekursiven Aufruf der Funktion in der zweiten Zeile, wird z als letztes Element an die Liste angehängt. Da in einer Liste alle Elemente vom selben Typ sein müssen, muss also auch der zweite Parameter vom selben Typ sein, wie der erste. Wären wir also bei a und a als Parameter. Die zweite Hürde ist, dass man erkennt, dass hier eine Liste in einer Liste zurückgegeben wird. Das ++ ist zu beachten. Normalerweise steht da ein simples : . Das ganze resultiert in folgende Lösung:

h :: [[a]] -> [a] -> [a]