Sprache Haskell
StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Haskell ist ein statisch polymorph getypte, rein funktionale Programmiersprache mit verzögerter Auswertung (lazy evaluation). Die Sprache ist benannt nach HaskellCurry, dessen Arbeit in mathematischer Logik ein Grundbaustein für die funktionalen Programmiersprachen war. Haskell basiert wie die SpracheLisp oder die SpracheScheme auf dem sogenannten LambdaKalkül?.
Haskell entstand aus einer Initiative zur Vereinheitlichung verschiedener auseinanderentwickelter funktionaler Sprachen. Es wird daher von vielen als der gegenwärtig bedeutendste Vertreter der nicht-imperativen Programmiersprachen angesehen.
Stärken:
- wesentlich gesteigerte Programmiereffizienz (Ericsson mass in einer Reihe von Experimenten mit Telefonsoftware eine Verbesserung um das 9 bis 25-fache!)
- kürzerer und klarer Programmcode, der leicht zu warten ist
- weniger Fehler, hohe Zuverlässigkeit
- die verzögerte Auswertung trennt Programmfluss von logischer Zusammengehörigkeit
- eine kleinere "semantische Kluft" zwischen Programmierer und Sprache
- in imperativer Denkweise gesprochen, kann man zum Beispiel Schleifenkörper und Schleifenabbrüche getrennt programmieren und danach beliebig miteinander kombinieren
- dies erlaubt eine noch bessere Modularisierung als zum Beispiel die SpracheModula?
- wegen dieser Trennung und wegen der kompakten Notation eignet sich Haskell als Ersatz für anwendungsspezifische Sprachen (domain specific languages - DSL)
- Haskore zur Beschreibung von Musik, http://www.haskell.org/haskore
- FunctionalMetaPost? zur Beschreibung von Grafik in einer abstrakten Form
- FunctionalReactiveAnimation? FRAN zur Beschreibung von Animation
- kürzere 'lead times' (Was soll das sein? -- HenningThielemann)
- Die gängigen Übersetzer unterstützen LiterarischesProgrammieren mit der Dateiendung .lhs statt .hs
- Gegenüber anderen funktionalen Sprachen sind auch Ein-/Ausgabeoperationen in das funktionale Konzept integriert (Monade)
Schwächen:
- Sonderlich effiziente Programme erzeugen die Übersetzer leider noch nicht, für Signalverarbeitung reicht es zum Beispiel nicht.
- Lazy Evaluation verhält sich nicht immer intuitiv. Zu fehlerhaften Programmen führt das zwar nicht, aber oft zu unnötig erhöhtem Ressourcenbedarf.
Besonderheiten: (einfach anders als anderswo, ohne Wertung)
- Haskell unterstützt zwar für imperativ-orientierte Programmabschnitte (zum Beispiel Hintereinanderausführung von Shell-Befehlen) eine imperative Syntax, sie korrekt zu verwenden bedarf aber des Verständnisses ihrer funktionalen Übersetzung.
Anmerkungen:
- Haskell gilt als ineffizient. Aktuelle Implementierungen erlauben zwar effizienten Code, aber man muss dafür durchaus Arbeit investieren; das Ergebnis muss nicht deutlich langsamer als das C-Äquivalent sein, und ist dabei immernoch schneller entwickelt und sieht angenehmer aus.
- Monaden sind eine etwas gewöhnungsbedürftige Art, Programme zu strukturieren. Sie erweisen sich praktisch als sehr flexibel und erweiterbar, ganz davon abgesehen, dass sie die Peinlichkeit von IO in Haskell 1.x für x<=2 beendet haben.
- Statische Typisierung heißt nicht, das man jeden Typ explizit erwähnen muss (darf man aber). Im Gegenteil, der Compiler (Interpreter gibt es auch) kann jeden Typ ausrechnen. Gibt man Typen an, bekommt man aber bessere Fehlermeldungen und zuweilen besser optimierten Code. Typecasts sind in Haskell vollkommen unnötig.
Taglines:
- Haskell - It's Pure Fun!
- Do It in a Monad... and remain pure
- Everything else is just dysfunctional programming.
Beispiele:
- Fibonacci-Zahlen, pur funktional, lineare Komplexität und ja, diese Liste ist wirklich unendlich, was nicht stört, solange man nur endliche Anfangsstücken verarbeitet. Die Typdeklaration ist optional:
| fibs :: [ Integer ]
fibs = 1 : 1 : zipWith (+) fibs (tail fibs) |
|
|
- Funktionaler Quicksort. Kleiner Betrug dabei: das erste Element der Liste wird zum Pivot, man könnte da weit mehr Intelligenz hinein stecken:
| qsort :: Ord a => [a] -> [a]
qsort [] = []
qsort (x:xs) = qsort [ y | y <- xs, y < x ] ++ [x] ++
qsort [ y | y <- xs, y >= x ] |
|
|
- Das gleiche Programm noch funktionaler (siehe QuickSort/Implementation), also ohne syntaktischen Zucker für Listenfilterung
| qsort :: Ord a => [a] -> [a]
qsort [] = []
qsort (x:xs) =
let (xlt, xge) = partition (<x) xs
in qsort xlt ++ [x] ++ qsort xge |
|
|
Für mehr Beispiele sollte man Hugs ( http://haskell.org/hugs) herunterladen und die mitgelieferte Bibliothek ansehen. Ziemlich eindrucksvoll sind die diversen Kombinatorbibliotheken, die sich wie Spezialsprachen anfühlen: PrettyPrint? (in der Hugs-Distribution enthalten), Parsec (Parser-Kombinatoren, kommen ebenfalls mit Hugs) und besonders WASH ( http://www.informatik.uni-freiburg.de/~thiemann/haskell/WASH/) sind sehr lehrreich. Übrigens bringt Haskell eine GetOpt?-Bibliothek mit, die gerade einmal 150 Zeilen Code umfaßt. Das Original sind 1500 Zeilen C.
Links:
Tutorials
Community:
KategorieProgrammierSprache KategorieStatischTypisiert KategorieFunktional
StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert: 22. Oktober 2006 10:50 (diff))