Sitzungen mit Hugs
Sitzungen mit Hugs
Hugs ist ein Interpreter mit dem typischen "`read-evaluate-write"'-Zyklus;
Hugs wertet aus:
- Haskell Ausdrücke
abgestützt auf Funktionssammlung im Standard-Prelude und/oder vom Benutzer geladenen Dateien mit Haskell Definitionen.
Ausdrücke werden durch "`Return"' abgeschlossen!
- durch ``:'' eingeleitete Kommandos, z.B.:
:? - listet Kommandos auf
:quit - beendet die Sitzung
Einige Beispiele:
1 pohlmann@okapi:hugs
___ ___ ___ ___ __________ __________
/ / / / / / / / / _______/ / _______/ Hugs 1.4
/ /___/ / / / / / / / _____ / /______
/ ____ / / / / / / / /_ / /______ / The Nottingham and Yale
/ / / / / /___/ / / /___/ / _______/ / Haskell User's System
/__/ /__/ /_________/ /_________/ /_________/ Version 970410
Copyright (c) The University of Nottingham and Yale University, 1994-1997.
Bug reports: hugs-bugs@haskell.org. Web: http://www.haskell.org/hugs.
Reading file "/usr/local/lib/hugs/lib/Prelude.hs":
Hugs session for:
/usr/local/lib/hugs/lib/Prelude.hs
Type :? for help
Prelude> 37-(2+5)
30
Prelude> 27-2+5
30
Prelude> min 3 4
3
Prelude> 3==4
False
Prelude> sum [1..10]
55
Prelude> reverse "Salzburg"
"grubzlaS"
Prelude>
Natürlich gibt's auch Fehlermeldungen -- für syntaktisch falsche Ausdrücke, undefinierte Bezeichner oder unanständige Wünsche, ...
- 1.
-
Prelude> 37-(2+5
ERROR: Syntax error in expression (unexpected end of input)
- 2.
-
Prelude> 37-(2+n)
ERROR: Undefined variable ``n''
- 3.
-
Prelude> let n=5 in 37-(2+n) -so geht's, und dies ist ein Kommentar!
30
- 4.
-
Prelude> 37-True
ERROR: Bool is not an instance of class ``Num''
- 5.
-
Prelude> 37`div`(5-5)
Program error: primDivInt 37 0
- 6.
-
Prelude> let x=x in x
ERROR: Cannot find ``show'' function for:
*** expression : let ... in x
*** of type : a
- 7.
-
Prelude> let x::Int; x=x in x
Interrupted! - mit Control-C
Richtige Programmierer wollen natürlich ihre eigenen Funktionen, Konstanten, Datentypen, ...definieren. Solche "`Script"' genannte Sammlungen von Definitionen werden in eine Datei geschrieben und vor Gebrauch geladen:
:load bla.bla
es ist sinnvoll, das Suffix ``.hs'' zu verwenden (es gibt Werkzeuge, die das brauchen);
außer solchen unstrukturierten Sammlungen gibt es auch einen Modulbegriff mit entsprechenden Bezügen (Export / Import), mehr dazu später!
- Beispiel:
-
Datei bla.bla:
area r=pi*r*r
where pi=3.1416
Datei error.bla:
area r=pi*r*r
were pi=3.1416
Damit folgende Hugs-Sitzung:
Prelude> :load bla.bla
Reading file "bla.bla":
Hugs session for:
/usr/local/lib/hugs/lib/Prelude.hs
bla.bla
Main> area 10
314.16
Main> :load error.bla
Reading file "error.bla":
Parsing
ERROR "error.bla" (line 2): Syntax error in input (unexpected `=')
Fehlermeldungen sind manchmal etwas schwierig zu interpretieren, woran oft die ungewohnte Typ-Philosophie von Haskell schuld ist (siehe später).
Im ersten Beispiel gilt:
- 1.
- fehlende Klammer
- 2.
- n ist keine "`Programmvariable"', sondern eine Variable im üblichen mathematischen Sinn, d. h. ein Konstantenbezeichner, wobei der Wert natürlich willkürlich ist, aber festgelegt werden muß,
- 3.
- diese Festlegung kann man mit ``let'' machen,
- 4.
- Typfehler: die Subtraktionsoperation ist (überladen!) für mehrere numerische Typen definiert, aber Bool ist kein numerischer Typ
- 5.
- Division durch 0 (`div` ist abgestützt auf eine speziellere elementare Divisionsoperation)
- 6.
-
let x=x in x führt auf Endlos-Schleife (=Wert von x ist undefiniert, wird aber "`gesucht"';
hier: Typ von x unklar, deshalb kann nicht die geeignete Funktion ``show'' zur Ausgabe des Ergebnisses bestimmt werden,
- 7.
- hier wird das Ergebnis als ``Int'' deklariert, und schon sind wir in der Endlos-Schleife ...
beachte:
- eine Gleichung wie pi = 3.14 oder area r = ... bindet einen Bezeichner an einen Wert (insbesondere ist also pi Konstant, nicht Variable)
- der Gebrauch einer ``where''-Klausel macht pi lokal zur Definition von area ( später);
grundsätzlich ist ein Skript eine Menge von Definitionen, die sich aufeinander beziehen können, aber z.B. auch:
pi = 3.14 - besser umbenennen: name clash mit Prelude!
area r = pi * r * r
circumference r = 2 * pi * r
- beim Laden werden die Definitionen analysiert und übersetzt, aber werden auch bei dieser Gelegenheit Syntaxfehler im Skript gemeldet!
Next:Grundlegende SprachelementeUp:Kurze Rundreise durch HaskellPrevious:Kurze Rundreise durch Haskell Ronald Blaschke
1998-04-19