Currying

Aus Infostudium Wiki

Wechseln zu: Navigation, Suche
Settings.png Dieser Artikel soll in Zukunft noch erweitert bzw. überarbeitet werden. Dies soll aber nicht als Reservierung aufgefasst werden. Mitarbeit ist erwünscht.


  • Prinzipiell ist add eine Funktion über zwei Argumenten.
  • Wenn wir allerdings den Ausdruck (add 3) betrachten, dann ist das eine Funktion, die zu jedem Wert, den wir als weiteres Argument hinzufügen, drei addiert.
  • Dieses Konzept nennt man Currying.
  • Der Typausdruck
add :: Num a => a -> a -> a
entspricht somit
add :: Num a => a -> (a -> a)
  • Dies bedeutet, dass add 1 eine Funktion ist, die zu jedem Argument eins addiert.
  • Damit können wir beispielsweise andere Funktionen definieren:
inc = add 1


Inhaltsverzeichnis

Andere Erklärung

  • Funktionen haben genau einen Parameter:
sq(n) = n*n
sq’ n = n*n
  • Mehrere Parameter können durch Klammerung zu einem Parameter vom Typ Tupel gemacht werden:
prod(x,y) = x*y
  • Alternative: Curry-Funktion
    • Die Funktion hat einen Parameter und
    • liefert als Ergebnis eine Funktion, die den nächsten Parameter verbraucht.
    • prod’ x y = x*y
  • Von Hugs bestimmter Typ:
prod :: Num a => (a,a) -> a
prod’ :: Num a => a -> a -> a

Was hat man nun davon?

Man hat davon, dass man sehr allgemeine Funktionen definieren kann. Betrachtet man zum Beispiel eine grundlegende Funktion von Haskell, nämlich map. Diese ist definiert als

map :: (a -> b) -> [a] -> [b]

Sie dient dazu alle Werte eines Feldes gleichzeitig zu bearbeiten. In Haskell möchte man häufig durch eine Liste [...] laufen und etwas mit allen Elementen anstellen. Dann müsste man jedesmal eine extra Funktion schreiben obwohl doch alle im Wesentlichen das gleiche machen.

Beispiel 1

Angenommen man hat nun eine Liste xs vom Typ [Int] (also eine Liste mit Ganzzahlen) und möchte für alle ihre Fakultät bestimmen. Die Funktion die die Fakultät bestimmt sei als fac :: Int -> Int gegeben. Dank Currying kann man dies formulieren als

map fac xs

Beispiel 2 (deutlichere Anwendung von currying)

Angenommen man möchte nun alle Werte von xs inkrementieren, dann kann man schreiben

map ((+) 1) xs

(+) ist hierbei als ganz normale Funktion zu verstehen (jeder Operator ist geklammert eine normale Funktion).