Inhalt

Funktionale Programmierung mit Haskell - "Lazy Evaluation"


Haskell - Typen und Funktionen

Vordefinierte Typen

  • Boole'scher Typ
      Ausdrücke des Typs Bool können die Werte True und False annehmen.

  • Listen
      ...werden mit Hilfe eckiger Klammern konstruiert:
      Leere Liste []
      Liste von Zeichen ['H','a','l','l','o']

  • Zeichenketten
      Strings sind Listen von Zeichen:
      type String = [char]

  • Tupel
      ...werden durch Komma getrennte Ausdrücke definiert:
      (a,b,c)
      Da das Komma den Konstruktor darstellt, erlaubt die Syntax von Haskell auch:
      (,,) a b c

  • Ein-/Ausgabe
      Die I/O-Typen und entsprechenden Fehlertypen haben keine offengelegten Konstruktoren. Sie dienen der Steuerung und Kontrolle von Ein- und Ausgabeoperationen.

Einige vordefinierte Klassen

  • Die "Eq"-Klasse
      ...stellt Gleichheits- und Ungleichheitsmethoden zur Verfügung für alle Typen ausser I/O.

  • Die "Ord"-Klasse
      ...stellt Vergleichs- und Min-/Max-Methoden zur Verfügung für alle Typen ausser Funktionen und I/O.

  • Die "Read" und "Show"-Klassen
      ...stellt String-Konversionsroutinen für Werte aller Typen zur Verfügung.

  • Die "Enum"-Klasse
      ... definiert Operationen für geordnete Aufzählungstypen.

  • Weitere ...

Numerische Typen und ihre Klassen

  • maschinenabh„ngiger Integer aus der Klasse "Integral"

  • Int aus der Klasse "Integral" mit fester Genauigkeit

  • Float,Double aus der Klasse "RealFloat"

  • Typen fr rationale und komplexe Zahlen...

Funktionen

  • Der Funktionstyp ist ein abstrakter Typ, dem nicht mit Hilfe eines Konstruktors ein Wert zugewiesen werden kann.

Deklaration einer einfachen Funktion:
    <Name> [<Formalparameter>] = <Ausdruck>

  • Das Gleichheitszeichen entspricht in Haskell weniger einer Zuweisung als einer Definition !

    zahl :: Integer
    zahl = 42 -- konst. Funktion "zahl" mit Wert 42

Beispiel für Addition:

    add1 (a,b) = a + b -- ein Parametertupel
    add2 a b = a + b -- zwei Parameter

Typsignatur
  • Die formellen Parameter der "add"-Routinen haben scheinbar keine Typen.
  • Ein Aufruf mit "Char"-Werten führt aber zu einem Laufzeitfehler!
  • Deshalb Einführung einer Typsignatur für bessere Lesbarkeit und Fehlererkennung

    add :: Float->Float->Float
    add a b = a + b

  • Die Typsignatur ist rechts-assoziativ:

    Float -> (Float -> Float) <=> Float -> Float -> Float

"Currying" (nach Haskell Curry)

  • Funktionen mit n>1 Parametern werden in Haskell als solche mit einem Parameter interpretiert, die einen Ausdruck auf den restlichen n-1 Parametern zurückliefern (Implizites "Currying").

  • "curried function":

    add :: Integer->Integer->Integer
    add a b = a + b

  • Die Anwendung der Funktion ist links-assoziativ: add a b <=> (add a) b

  • Der Ausdruck wird zu der Funktion "addiere a" mit dem Parameter b umgeformt.

  • Dies entspricht der äquivalenten Typsignatur Integer->(Integer->Integer), also einem Integer als Parameter und einer Funktion mit einem Integer-Parameter als Rückgabewert.

  • "Uncurried functions" sind entsprechend Funktionen mit genau einem Parameter (auch Tupel)
Partielle Anwendung
  • Mit Hilfe von "curried functions" können spezialisierte Adapter-Ausdrücke definiert werden, die diese anwenden.

  • Beispiel

    mult :: Float->(Float->Float)
    mult a b = a * b

    Durch partielle Anwendung der "curried function" mult kann die Verdopplungs-Funktion als spezielle Multiplikation implementiert werden:

    
    doppel = mult 2	-- "Explizites Currying"
    doppel 3 -- wird zu 6 ausgewertet


zurück Seitenanfang weiter