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 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" 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 :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 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] Prelude> product[1..200] (Versuchen Sie mal product[1..1000]
|
succ | Die
Funktion succ (successor) bildet eine Zahl auf ihren Nachfolger ab.
*EigeneFunktionen> succ 3 *EigeneFunktionen> succ (succ 3) 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 |
Ü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 |