1.  Programmierumgebung von Glasgow-Haskell-Compiler
  Die Installation des Glasgow-Compilers erzeugt standartmäßig eine Dateistruktur ghc\ghc-6.2.2. In dem Unterverzeichnis bin findet sich  das Programm ghci.exe. Auf dem Desktop erzeugt man sich am besten einen Link auf dieses Programm.

Bei Starten dieses Programms meldet sich der Glasgow-Haskell-Compiler-interaktiv. sich im Windows-Ausgabefenster:

 

 

max

 

Das Eingabepromptzeichen steht hinter <Prelude>. Dieser Name und der Text in der Zeile darüber lässt vermuten, dass bei der interaktiven Eingabe eine Reihe von Funktionen zur Verfügung stehen.

Gibt man hinter dem Promptzeichen z.B. 2+4 ein und betätigt die Enter-Taste, so wird die Funktion '+' für die beiden Parameter 2 und 6 aufgerufen. Für die Funktion '+' benutzen wir also die Infix-Notation . Die Funktion wertet den Rechenausdruck aus und gibt den Wert, also den Funktionswert auf dem Bildschirm aus.

Prelude> 2+4
6

Die Eingabe reverse "Schueler studieren Informatk", ruft die Funktion reverse auf, "Schüler studieren Informatik" erschein als Übergabeparameter, ist aber nichts anderes als der Wert einer Funktionsvariable mit dem Definitionsbereich die Menge aller Strings, der auf einen Wert, nämlich dem rückwärts geschrieben Text "ktamrofnI nereiduts releuhcS" abgebildet wird. 

Prelude> reverse "Schueler studieren Informatik"
"kitamrofnI nereiduts releuhcS"

Genauer können wir sagen: reverse ist eine Abbildung (Funktion) von der Menge aller Strings in die Menge aller Strings und ihre Funktionalität besteht darin, dass die Zeichen, aus denen der konkrete String besteht, in umgekehrter Reihenfolge in den Bildstring aufgereiht werden.

Funktionen können mehr als eine Variable haben. Ein einfaches Beispiel dafür ist die Funktion max, der man die Werte zweier Variablen übergibt und die dann einen Wert liefert. Mathematisch würde man die Funktion max so beschreiben:

max: AxB->C

Die Funktionalität prüfe man mit der Eingabe max 2 3

Prelude> :set +t
Prelude> max 2 4
4
cmTypeOfName: it
it :: Integer

:set +t (Wichtig ist der Doppelpunkt zu Beginn der Eingabe) ist ein Befehl auf der Ebene der Programmierumgebung und ist somit keine Funktion von Haskell. :set +t setzt einen Schalter, der unser System dazu veranlasst, nach einer Ausgabe, den Typ (Wertebereich der Funktion) anzugeben. Wir erkennen also, dass max 3 4 einen Wert aus der Menge Integer liefert. Und noch etwas sollten wir uns merken: Während wir die mathematische Schreibweise max(2,4) = 4 erwarten, werden in der Haskellsyntax die Parameter untereinander und vom Funktionsnamen nur durch ein Leerzeichen getrennt.

Interessant ist auch

Prelude> max 3.0 4.0
4.0
cmTypeOfName: it
it :: Double
Prelude
>
 

Wir erkennen, dass die Funktion max überladen ist. Es wird offensichtlich, dass das System beim Aufruf erkennt, welche Funktion max benutzt wird, die, die das Maximum zweier Integer-Werte bestimmt und damit einen Integer-Wert liefert, oder die, die das Maximum zweier Double-Werte bestimmt und dann eben einen Double-Wert liefert. Wir sagen auch, die Funktion max ist polymorph.

 

  Wir wollen uns an dieser Stelle nicht näher mit diesem Quelltext beschäftigen.
product Der vordefinierten Funktion product übergeben wir [1..100] also eine Liste der ersten 100 Integer-Werte. produkt berechnet dann deren Produkt

product[1..100]
9332621544394415268169923885626670049071596826438162146859296
3895217599993229915608941463976156518286253697920827223758251
185210916864000000000000000000000000 :: Integer

Prelude> product[1..200]
7886578673647905035523632139321850622951359776871732632947425
3324435944996340334292030428401198462390417721213891963883025
7642790242637105061926624952829931113462857270763317237396988
9439224456214516642402540332918641312274282948532775242424075
7390324032125740557956866022603190417032406235170085879617892
2222789623703897374720000000000000000000000
000000000000000000000000000 :: Integer

 (Versuchen Sie mal product[1..1000]

 

succ Die Funktion succ (successor) bildet eine Zahl auf ihren Nachfolger ab.

*EigeneFunktionen> succ 3
4

Die Mehrfachanwendung ist möglich, also

*EigeneFunktionen> succ (succ 3)
5

Wie in der Mathematik wo (f°g)(x) = f(g(x)) ist, soll es in einer funktionalen Sprache wie Haskell auch die Komposition von Funktionen geben. Tatsächlich hat Haskell eine infix-Operator '.', der die Kompostion zulässt. Statt succ (succ 3) zu schreiben schreiben wir:

*EigeneFunktionen> (succ.succ) 3
5
 

Übung 1 Berechnen Sie die Summe der ersten 100 Inter-Werte, der Funktionsname ist sum
Übung 2 Die Funktion max kann man auch Zeichen (Char) vergleichen und das 'größere' finden. Um einen Buchstaben bzw. eine einstellige Zahl als Zeichen zu definieren, schreibt man es in Hochkommas z.B. 'a', 'A' oder '3'.
Zeichenketten oder
Strings (= Liste von Zeichen, also: [char]) schreibt man in Anführungsstrichen also "Anton", "Zappa" oder "123". Man beachte '2' ist nicht das selbe wie "2" oder 2. Die Funktion max, die Zeichen bzw. Strings als Variable hat, bestimmt das Maximum über eine lexikalische Ordnung. Prüfen Sie dies mit geeignet gewählten Beispielen nach.  Wer kommt demnach zuerst im Alphabet 'a' oder 'A'?
Übung 3 Wie kann ich mit einem Befehl drei Werte gleichen Typs auf ihr Maximum untersuchen?
Übung 4 Zeigen Sie an einem selbst gewählten Beispiel, dass die Funktion reverse selbstinvers ist.
Lösungen hier kommen Sie zu den Lösungen
 

(C) Michael Pohlig 2005   -> www.pohlig.de