Funktionale Programmierung

  • Keine Globalen Variablen, Effekt kann simuliert werden durch Mitschleifen in sämtlichen Funktionen (Stichwort Monaden)
  • Jede Funktion hat einen Rückgabewert
  • Lazy Evaluation (Deutsch: Verzögerte Ausgabe)
    Java Equivalent sind Streams
  • Funktionen können Teil der Ein oder Ausgabe einer Funktion sein

Funktion als Eingabe

Beispiel Vektorarithmetik

  • Jedes Element wird auf die Funktion angewandt
    Also die beiden Ersten Element verknüpft bilden das erste Element des Ergebnis
  • Java Äquivalent sind Interfaces
  • Funktionale Interfaces sind durch Lambdas implementiert
  • Rekursion durch Liste über Head - Tail Konstruktion

Funktion als Ausgabe

Beispiel Addition einer Konstanten

  • Rückgabe eines Lambda Ausdrucks
  • In Java einigermaßen umständlich

Haskell

Block-Konstrukt durch Einrückung in Zeichen. Einrücken der nächsten Zeile wird als Fortsetzung der vorherigen gewertet.

Häufiger Fehler

4 Leerzeichen sind als lvl 4 eingerückt, ein gleich aussehender Tab wird als Stufe 1 gewertet

Let-Where-Konstrukt

Beispiel Länge einer Liste.
Funktion braucht mangels globaler Variablen Parameter um das Ergebnis rekursiv zu übergeben. Let-in Konstrukt ermöglicht “Standardwerte” für den ersten Aufruf der Hilfsfunktion

Where Konstrukt erfüllt den selben Zweck

! Operator

Mit einem ! kann die Lazy-Evaluation (zum Debuggen) umgangen werden.
Der Ausdruck wird sofort berechnet.
Nützlich bei Erstellung einer Liste [a, b, a+b] in der Elemente aus anderen berechnet werden.

Compiling

ghc filename.hs

Currying

Jede Funktion von Argumenten kann als Kette von Funktionen abgebildet werden die jeweils 2 Argumente akzeptieren und das selbe Ergebnis berechnet.

Dieser Vorgang kann auch umgekehrt stattfinden, man spricht von Un-currying

Durch Klammern kann ein Infix-Operator zur gecurryten Präfix-Variante werden.
(+) 1 2 = 1 + 2