www.wikidata.de-de.nina.az
Haskell ist eine rein funktionale Programmiersprache 3 benannt nach dem US amerikanischen Mathematiker Haskell Brooks Curry dessen Arbeiten zur mathematischen Logik eine Grundlage funktionaler Programmiersprachen bilden Haskell basiert auf dem Lambda Kalkul weshalb auch der griechische Buchstabe Lambda als Logo verwendet wird Die wichtigste Implementierung ist der Glasgow Haskell Compiler GHC HaskellBasisdatenParadigmen funktional nicht strikt modular deklarativErscheinungsjahr 1990Designer Lennart Augustsson Warren Burton Kevin Hammond Paul Hudak John Hughes Thomas Johnsson Simon Peyton Jones John Launchbury Erik Meijer Alastair Reid Philip WadlerEntwickler Simon Peyton Jones Paul Hudak 1 Philip Wadler et al Aktuelle Version Haskell 2010 2 Juli 2010 Typisierung statisch stark TypinferenzWichtige Implementierungen GHC Hugs NHC JHC YhcDialekte Helium GoferBeeinflusst von APL LISP Miranda ML C Beeinflusste Agda Cayenne Clean Curry Idris Python Rust Scala C F Swift JavaScriptBetriebssystem Microsoft Windows Unix ahnliches Systemhaskell org Inhaltsverzeichnis 1 Entwicklung 2 Eigenschaften 2 1 Programmfluss 2 2 Typsystem 2 3 Syntax 2 4 Programmierung 2 5 Module 3 Beispiele 3 1 Fakultat 3 2 Fibonacci 3 3 Differenzengleichung 3 4 Quicksort 3 5 Algebra 4 Implementierungen 5 Einfluss 6 Siehe auch 7 Literatur 8 Weblinks 9 EinzelnachweiseEntwicklung BearbeitenDieser Artikel oder nachfolgende Abschnitt ist nicht hinreichend mit Belegen beispielsweise Einzelnachweisen ausgestattet Angaben ohne ausreichenden Beleg konnten demnachst entfernt werden Bitte hilf Wikipedia indem du die Angaben recherchierst und gute Belege einfugst Gegen Ende der 1980er Jahre gab es bereits einige funktionale Programmiersprachen Um der Wissenschaft eine einheitliche Forschungs und Entwicklungsbasis bereitzustellen sollte eine standardisierte und moderne Sprache die funktionale Programmierung vereinheitlichen Zunachst wollte man dazu Miranda als Ausgangspunkt benutzen doch deren Entwickler waren daran nicht interessiert So wurde 1990 Haskell 1 0 veroffentlicht 4 Die Sprachderivate von Haskell sind zahlreich dazu zahlen Parallel Haskell Distributed Haskell ehemals Goffin Eager Haskell Eden mit einem neuen Ansatz zum parallelen Programmieren und Bedarfsauswertung DNA Haskell und sogar objektorientierte Varianten Haskell O Haskell Mondrian Des Weiteren diente Haskell beim Entwurf neuer Programmiersprachen als Vorlage So wurde beispielsweise im Falle von Python die Lambda Notation sowie Listenverarbeitungssyntax ubernommen 5 Eigenschaften BearbeitenProgrammfluss Bearbeiten Haskell ist eine rein funktionale Programmiersprache Funktionen geben nur Werte zuruck andern aber nicht den Zustand eines Programms d h Funktionen haben keine Nebeneffekte Das Ergebnis einer Funktion hangt deshalb nur von den Eingangsparametern ab und nicht davon wann oder wie oft die Funktion aufgerufen wird Es gibt keine imperativen Sprachkonstrukte Durch Monaden ist es moglich Ein und Ausgabeoperationen und zustandsabhangige Berechnungen wie Zufallsgeneratoren rein funktional zu behandeln Es gibt keine Operationen die einen Variablenwert verandern So gibt es auch keine Unterscheidung zwischen Variablen und Konstanten und man braucht keine const Attribute oder Literal Makros wie in C oder in C Zwischen Identitat und Gleichwertigkeit von Objekten wird nicht unterschieden Da Nebeneffekte fehlen sind Programmbeweise betrachtlich einfacher Haskell ist nicht strikt Es werden nur Ausdrucke ausgewertet die fur die Berechnung des Ergebnisses gebraucht werden first x y x quadrat x x x Die Funktion first liefert bei Eingabe zweier Parameter den ersten als Ergebnis zuruck Bei der Eingabe von first x 3 7 ist die Auswertung der Summe 3 7 zur Ergebnisbestimmung nicht notwendig sollte also unberucksichtigt bleiben Die Funktion quadrat berechnet bei Eingabe eines Parameters dessen Quadrat Bei Eingabe von quadrat 3 5 was im Laufe des Auswertungsprozesses zu 3 5 3 5 wird ware eine doppelte Berechnung der Summe 3 5 ineffizient sollte also vermieden werden Die Auswertungsstrategie welche die beiden eben geschilderten Probleme umgeht wird Bedarfsauswertung englisch lazy evaluation genannt und kommt in Haskell meist zum Einsatz Die Bedarfsauswertung ist vor allem wegen der strengen Einhaltung des funktionalen Konzepts moglich Umgekehrt macht die Bedarfsauswertung die funktionale Programmierung angenehmer denn sie erlaubt es besser Funktionen die reine Berechnungen durchfuhren von Ein Ausgabefunktionen zu trennen Die Bedarfsauswertung erlaubt das Arbeiten mit undefinierten Werten und potentiell unendlich grossen Datenmengen So kann man elegant mit Potenzreihen Zeitreihen etwa Audiosignalstromen Kettenbruchzerlegungen Entscheidungsbaumen und ahnlichem umgehen Aber auch bei endlichen aber grossen oder endlichen und noch nicht vollstandig bekannten Daten erlaubt diese Art der Ausfuhrung elegante Programme So kann man etwa eine Transformation eines XML Dokumentes als Folge von Transformationen des gesamten XML Baumes beschreiben Ausgefuhrt wird die Gesamttransformation aber von Beginn zum Ende des XML Dokumentes auch wenn das Ende noch gar nicht verfugbar ist Man beachte allerdings dass Haskell nach Sprachdefinition lediglich nicht strikt ist die Bedarfsauswertung ist nur eine mogliche Implementierung der Nicht Striktheit die allerdings von allen gangigen Haskell Ubersetzern angewandt wird Andere Implementierungen sind moglich z B optimistic evaluation Ennals amp Peyton Jones ICFP 03 Typsystem Bearbeiten Haskell ist stark typisiert 6 Es wird also zum Beispiel streng zwischen Wahrheitswerten Zeichen ganzen Zahlen Gleitkommazahlen und Funktionen von und zu verschiedenen Typen unterschieden Haskell erlaubt Typvariablen Damit konnen Funktionen sehr allgemein formuliert werden Wird eine allgemeingehaltene Funktion fur bestimmte Typen verwendet werden automatisch die Typen abgeglichen Typinferenz Die Funktion map wendet eine beliebige Funktion auf die Elemente einer Liste an Ihr Typ wird so angegeben map a gt b gt a gt b Wird map etwa mit der speziellen Funktion toUpper vom Typ Char gt Char aufgerufen ergibt der Typabgleichmap toUpper Char gt Char Haskell ist von der Grundidee her statisch typisiert obwohl es auch Erweiterungen fur dynamische Typen gibt Das bedeutet dass fur die meisten Berechnungen die Typen bereits zum Zeitpunkt der Programmubersetzung feststehen Dies deckt viele offensichtliche Fehler noch vor Ausfuhrung des Programms auf Haskell unterstutzt Funktionen hoherer Ordnung Funktionale 7 Das sind Funktionen die Funktionen als Eingabeparameter bzw Funktionen als Ergebnis haben Ein Beispiel ist die map Funktion die eine Funktion f auf jedes Element eines Datentyps hier Liste anwendet map a gt b gt a gt b map f map f x xs f x map f xs map quadrat 1 2 3 quadrat 1 quadrat 2 quadrat 3 1 4 9 Funktionen erlauben Currying Wahrend man in anderen Sprachen Tupel als Argumente an Funktionen ubergibt also Funktionstypen der Form span class p span span class n a span span class p span span class w span span class n b span span class p span span class w span span class ow gt span span class w span span class n c span verwendet ist in Haskell die Curry Form span class nf a span span class w span span class ow gt span span class w span span class n b span span class w span span class ow gt span span class w span span class n c span ublicher Damit wird die partielle Auswertung von Funktionen bequem moglich Der Ausdruck map toUpper ist beispielsweise eine teilweise Auswertung von map denn er beschreibt eine Funktion namlich die Funktion welche alle Kleinbuchstaben einer Liste in Grossbuchstaben verwandelt Haskell erlaubt benutzerdefinierte Datentypen Diese algebraischen Datentypen werden mit Hilfe von Datenkonstruktoren definiert data Tree Leaf Int Branch Int Tree Tree Das Beispiel zeigt die Datenstruktur eines mit ganzen Zahlen beschrifteten binaren Baumes Solch ein Baum Tree besteht entweder aus einem Blatt Leaf Int oder einer Verzweigung span class kt Branch span span class w span span class kt Int span span class w span span class n t1 span span class w span span class n t2 span wobei t1 und t2 die Teilbaume darstellen die wiederum die Struktur Tree haben Zur Definition dieser Datenstruktur wurde sowohl der einstellige Konstruktor Leaf als auch der dreistellige Konstruktor Branch verwendet Datentypen mit mehreren ausschliesslich parameterlosen Konstruktoren konnen als Aufzahlungen eingesetzt werden data Tag Montag Dienstag Mittwoch Donnerstag Freitag Samstag Sonntag deriving Show Eq Ord Ix Enum Haskell unterstutzt Typenklassen Mit Typenklassen lassen sich Typen zusammenfassen welche eine bestimmte Menge an Operationen unterstutzen In Signaturen von Funktionen durfen als Abstufung zwischen festen Typen wie Char und freien Typvariablen auch noch Typvariablen mit Einschrankung auf bestimmte Klassen verwendet werden Alle Auspragungen einer Methode der Typklasse tragen den gleichen Namen In gewisser Weise entsprechen Typklassen also dem Uberladen von Funktionen Der gleiche Funktionsname steht also abhangig vom Typ fur verschiedene Funktionen Zum Beispiel ist mit der Methode der Klasse Eq der Vergleich sowohl zweier Zahlen als auch zweier Texte moglich Trotzdem arbeitet der Gleichheitstest je nach Argumenttyp anders In Haskell haben Ein und Ausgabefunktionen einen speziellen Typkonstruktor namens span class kt IO span putStrLn String gt IO getLine IO String putStrLn gibt einen Text und einen Zeilenumbruch auf der Standardausgabe aus Da es kein informationstragendes Ergebnis gibt wird der Einheitstyp span class nb span als Ruckgabetyp verwendet getLine liest eine Textzeile von der Standardeingabe Der span class kt IO span Typkonstruktor stellt sicher dass man den Nutzern der Funktion offenlegen muss dass die Ergebnisse durch Ein Ausgabe gewonnen wurden Diese strenge Handhabung ermuntert Haskell Programmierer zur klaren Trennung von Ein und Ausgabe und anderen Teilen eines Programms Der grosste Teil eines Haskell Programms besteht in der Regel aus Funktionen ohne Ein und Ausgabe Man kann span class kt IO span Typen naturlich auch in andere Typen einbetten und so zum Beispiel einen speziellen IO Typ definieren der nur Eingaben erlaubt Syntax Bearbeiten Haskell unterscheidet Gross und Kleinschreibung 8 Bezeichner die mit einem Grossbuchstaben beginnen stehen fur Typ und Wertkonstruktoren Bezeichner die mit einem Kleinbuchstaben beginnen stehen fur Typvariablen Funktionen und Parameter Der Umgang mit Leerzeichen und Zeilenumbruchen geschieht in Anlehnung an das intuitive Verstandnis von mathematischer Notation bei Zeilenumbruchen muss lediglich eine Einruckung beliebiger Tiefe geschehen damit der Zusammenhang nicht verlorengeht So ist der Ausdruck fun a b a b vollig gleichwertig zu fun a b a b Haskell unterstutzt einzeilige und mehrzeilige Kommentare erstere ab den Zeichen bis zum Ende der Zeile und letztere im Einschluss von und f x x 2 f y y 5 diese Zeile ist auskommentiert Alles was hier drin steht wird auch nicht beachtet f z z 2 Haskell bietet eine Reihe von syntaktischen Besonderheiten Diese sollen nicht daruber hinwegtauschen dass alles rein funktional erklart ist Die do Notation verleiht Berechnungen mit Monaden das Aussehen von imperativen Programmen StattreadFile eingabe txt gt gt writeFile ausgabe txt oderreadFile eingabe txt gt gt inhalt gt writeFile ausgabe txt inhalt kann man auchdo inhalt lt readFile eingabe txt writeFile ausgabe txt inhalt schreiben Sowohl symbolische Bezeichner bestehend etwa aus gt lt als auch alphanumerische Bezeichner Buchstaben Ziffern und Apostroph konnen fur Funktionsnamen verwendet werden und sowohl als Infix Operatoren als auch in Prafixschreibweise eingesetzt werden Es gilt beispielsweisea b a b a div b div a b Haskell erlaubt spezielle Notationen bei der Listenverarbeitung So konnen unter anderem Zahlenfolgen mit zwei Punkten span class o span angedeutet werden 0 5 0 1 2 3 4 5 a e a b c d e abcde 0 2 10 0 2 4 6 8 10 Wird kein Endwert angegeben dann wird eine unendliche Liste erzeugt 1 1 2 3 usw 10 20 10 20 30 usw Des Weiteren ist eine Notation erlaubt genannt list comprehension die an die mathematische Schreibweise fur Mengendefinitionen angelehnt ist In folgendem Beispiel wird aus der Folge der positiven naturlichen Zahlen die Folge der geraden Zahlen extrahiert x x lt 1 even x als Umschreibung furdo x lt 1 guard even x return x Im Allgemeinen kann hinter dem senkrechten Strich eine beliebige nichtleere Folge aus Generatoren pat lt xs Pradikaten Ausdrucken mit dem Typ Bool und let Bindungen angegeben werden Insbesondere ist es moglich uberhaupt keine Generatoren zu verwenden Der Ausdruck x odd x nimmt je nach Wert von x welches als bereits definiert vorausgesetzt wird den Wert oder x an Programmierung Bearbeiten Haskell erlaubt Mustervergleiche engl pattern matching So nennt man die Verwendung von Konstruktortermen als formale Parameter Dabei sind die Parameterterme die Muster engl pattern der Funktionsargumente fak Integer gt Integer fak 0 1 fak n n fak n 1 Die Funktion fak berechnet die Fakultat einer Zahl 0 und n sind dabei die Muster Pattern von denen die Ergebnisbestimmung abhangt Fur Zahlen grosser als 0 greift nur das Muster n so dass zweitere Alternative verwendet wird Diese errechnet das Ergebnis durch span class nf n span span class w span span class o span span class w span span class n fak span span class w span span class p span span class n n span span class o span span class mi 1 span span class p span wobei sie sich solange span class p span span class n n span span class o span span class mi 1 span span class p span span class w span span class o gt span span class w span span class mi 0 span ist rekursiv selbst aufruft bis sie bei 0 ankommt Dort greift dann das Muster 0 so dass erstere Alternative verwendet wird welches die Rekursion sauber abschliesst 1 zuruckgibt und die Rucksprungkette einleitet Module Bearbeiten Zu Haskell gehort auch ein Modulsystem Der Haskell 98 Standard definiert eine Grundmenge von Modulen 9 die ein standardkonformes Haskell System zur Verfugung stellen muss Beispielsweise ein Modul welches Ein und Ausgabe Funktionen bereitstellt oder ein Modul welches Funktionen auf Listen implementiert Um Module nutzen zu konnen muss man sie importieren Dies geschieht mithilfe des span class kr import span Befehls import List import Maybe In verschiedenen Modulen konnen Funktionen und Typen die gleichen Namen besitzen Diese Bezeichner konnen unterschieden werden indem nur einer der Bezeichner importiert wird import Data List delete x delete a abc oder indem die Bezeichner qualifiziert also durch Verbinden mit dem Modulnamen eindeutig gemacht werden import qualified Data List x Data List delete a abc oderimport qualified Data List as List x List delete a abc Ebenfalls moglich aber nicht empfohlen ist das Ausblenden von Bezeichnern beim Importieren mit hiding Beispiele BearbeitenFakultat Bearbeiten Eine elegante Definition der Fakultatsfunktion die Haskells Notation fur Listen benutzt fac Integer gt Integer fac n product 1 n Oft wird aber auch rekursiv gearbeitet facr Integer gt Integer facr 0 1 facr n n facr n 1 Endrekursion ist dabei oftmals effizienter aber auch aufwendiger zu schreiben facrt Integer gt Integer facrt n facrt n 1 where facrt 0 r r facrt n r facrt n 1 r n Diesen Schreibaufwand kann man jedoch reduzieren In facrt enthalt der Parameter r das jeweilige Zwischen Resultat Zu Beginn der Iteration wird r auf den Startwert gesetzt Bei jedem Iterationsschritt wird das neue Zwischenergebnis mit einer bestimmten Funktion aus dem bisherigen Zwischenresultat und n berechnet Zum Schluss wird r als Endergebnis zuruckgegeben Dieses Prinzip kann man durch eine wiederverwendbare Funktion recur ausdrucken recur Num a Eq a gt b gt a gt b gt b gt a gt b recur f r 0 r recur f r n recur f f r n n 1 Unter Verwendung von recur kann man die Fakultatsfunktion mit Endrekursion dann sehr kompakt schreiben facrg Integer gt Integer facrg recur 1 Fibonacci Bearbeiten Eine einfache Implementierung der Fibonacci Funktion fib Integer gt Integer fib 0 0 fib 1 1 fib n fib n 2 fib n 1 Eine schnelle Implementierung der Folge fibs Integer fibs 0 1 zipWith fibs tail fibs tail entfernt das erste Element aus einer Liste zipWith kombiniert zwei Listen elementweise mithilfe einer weiteren Funktion hier Die Definition entspricht einer Fixpunktgleichung Dass die Definition stimmt uberpruft man am schnellsten indem man sich vorstellt dass fibs bereits fertig berechnet vorliegt Als Nachstes muss man sich noch uberlegen dass die Definition auch ausgewertet werden kann Die ersten beiden Glieder von fibs sind unmittelbar klar 0 und 1 Fur das Berechnen jedes weiteren Gliedes muss aber nur auf bereits berechnete Glieder von fibs zuruckgegriffen werden Die Bedarfsauswertung fuhrt dazu dass die Folge fibs tatsachlich elementweise berechnet wird Man konnte auch sagen dass fibs ein Fixpunkt der Funktion span class nf span span class n xs span span class w span span class ow gt span span class w span span class mi 0 span span class w span span class kt span span class w span span class mi 1 span span class w span span class kt span span class w span span class p span span class n zipWith span span class w span span class p span span class o span span class p span span class w span span class n xs span span class w span span class p span span class n tail span span class w span span class n xs span span class p span ist Das wiederum lasst sich in Haskell direkt notieren als fix xs gt 0 1 zipWith xs tail xs Differenzengleichung Bearbeiten Man kann auf diese Weise sehr elegant Differentialgleichungen bezuglich Potenzreihen oder Differenzengleichungen bezuglich Zahlenfolgen formulieren und gleichzeitig losen Angenommen man mochte die Differentialgleichung y x f x y x bezuglich y in Form einer Zeitreihe losen also einer Liste von Zahlen Durch diese Diskretisierung wird die Differentialgleichung zur Differenzengleichung Statt eines Integrals berechnen wir Partialsummen Die folgende Funktion hat als Parameter die Integrationskonstante und eine Zahlenfolge integrate Num a gt a gt a gt a integrate scanl scanl akkumuliert die Werte einer Folge mit Hilfe einer anderen Funktion hier und gibt die Liste der Akkumulatorzustande zuruck Damit kann man bereits das explizite Eulerverfahren fur die Schrittweite 1 implementieren x0 und y0 sind hierbei die Anfangswerte Der Apostroph hat keine eigenstandige Bedeutung er ist Teil des Namens y eulerExplicit Num a gt a gt a gt a gt a gt a gt a eulerExplicit f x0 y0 let x iterate 1 x0 y integrate y0 y y zipWith f x y in y Diese Funktionsdefinition besteht also im Wesentlichen aus der Feststellung dass y das Integral von y mit Anfangswert y0 ist oder umgekehrt y die Ableitung von y und aus der eigentlichen Differentialgleichung span class nf y span span class w span span class ow span span class w span span class n zipWith span span class w span span class n f span span class w span span class n x span span class w span span class n y span Weil man hierbei den Algorithmus eher in der Form der Aufgabenstellung als in Form eines Losungsweges notiert spricht man hierbei von deklarativer Programmierung Quicksort Bearbeiten Der Quicksort Algorithmus formuliert in Haskell qsort Ord a gt a gt a qsort qsort x xs qsort kleinergl x qsort groesser where kleinergl y y lt xs y lt x groesser y y lt xs y gt x Die erste Zeile definiert die Signatur von Quicksort Die zweite Zeile gibt an dass die Funktion auf eine leere Liste angewendet wieder eine leere Liste ergeben soll Die dritte Zeile sortiert rekursiv nicht leere Listen das erste Element x wird als mittleres Element der Ergebnisliste verwendet Davor werden alle nicht grosseren sortiert dahinter alle grosseren Elemente eingeordnet Listenbeschreibungen werden dazu verwendet aus der Restliste xs alle diejenigen auszuwahlen die grosser als x sind und alle jene die es nicht sind Wie man es von Quicksort erwartet besitzt auch diese Implementierung eine mittlere asymptotische Laufzeit von O n logn und eine Worst Case Laufzeit von O n Im Gegensatz zur gelaufigen Implementierung in einer imperativen Sprache arbeitet dieses qsort jedoch nicht in place Algebra Bearbeiten Dieses Beispiel stellt die Nutzung von Typklassen heraus data PhiNum a PhiNum numPart a phiPart a deriving Eq Show instance Num a gt Num PhiNum a where fromInteger n PhiNum fromInteger n 0 PhiNum a b PhiNum c d PhiNum a c b d PhiNum a b PhiNum c d PhiNum a c b d a d b c b d negate PhiNum a b PhiNum a b abs undefined signum undefined fib n phiPart PhiNum 0 1 n fib stellt eine schnelle Berechnung von Elementen der Fibonacci Folge dar Ausgenutzt wird das vordefinierte das auf Num implementierenden Typen arbeitet Implementierungen BearbeitenEs gibt inzwischen eine Reihe Haskell Implementierungen von denen die meisten aber den Sprachstandard nicht vollstandig umsetzen Der Glasgow Haskell Compiler 10 GHC unterstutzt Haskell 98 sowie zahlreiche Spracherweiterungen Er ubersetzt Haskell Programme in Maschinencode fur nicht direkt unterstutzte Plattformen erzeugt er C Code der dann mit einem C Compiler ubersetzt wird Hugs 11 ist ein Bytecode Compiler der Haskell 98 fast vollstandig sowie einige Erweiterungen implementiert Hugs ist selbst in C geschrieben nhc 12 13 auch nhc98 ist ein weiterer Bytecode Compiler der Haskell 98 mit gewissen Einschrankungen unterstutzt Der York Haskell Compiler oder Yhc ist eine Weiterentwicklung von nhc mit dem Ziel Portabilitat und Performance der kompilierten Programme zu verbessern Der Utrecht Haskell Compiler 14 UHC ist eine experimentelle Implementierung die an der Universitat Utrecht entwickelt wird Der Compiler basiert auf Attributgrammatiken und ubersetzt Haskell in C Code Er implementiert Haskell 98 fast vollstandig sowie einige Erweiterungen Helium 15 wird ebenfalls an der Universitat Utrecht entwickelt Der Schwerpunkt des Projekts liegt darauf leicht verstandliche Fehlermeldungen zu erzeugen um Anfangern das Erlernen von Haskell zu erleichtern Daher wird auch ein eingeschrankter Haskell Dialekt implementiert der unter anderem keine Typklassen hat Die hier genannten Implementierungen sind alle Open Source Software Bis auf Hugs sind sie auch alle in Haskell selbst implementiert Einfluss BearbeitenHaskell dient wegen seiner stark akademischen Herkunft vielen Programmier und Scriptsprachen als Vorbild fur neue Sprachfunktionalitat So haben u a Perl Python JavaScript Java Scala Rust und PHP Ideen der funktionalen Programmierung von Haskell ubernommen Dazu gehoren Funktionen hoherer Ordnung wie map filter usw Teile der Art wie generische Programmierung implementiert wurde und anderes Siehe auch BearbeitenInternational Conference on Functional Programming Contest Pugs eine Perl 6 Implementierung in Haskell DAML eine smart contract Sprache basierend auf Glasgow Haskell Compiler Literatur BearbeitenRichard Bird Introduction to Functional Programming using Haskell 2 Auflage Prentice Hall Europe 1998 ISBN 0 13 484346 0 englisch Marco Block Adrian Neumann Haskell Intensivkurs Ein kompakter Einstieg in die funktionale Programmierung Springer Heidelberg u a 2011 ISBN 978 3 642 04717 6 doi 10 1007 978 3 642 04718 3 Paul Hudak The Haskell school of expression Learning functional programming through multimedia Cambridge University Press Cambridge u a 2000 ISBN 0 521 64338 4 englisch Neuauflage The Haskell school of music PDF 2 4 MB Version 2 2 2012 Ernst Erich Doberkat Haskell Eine Einfuhrung fur Objektorientierte Oldenbourg Wissenschaftsverlag Munchen 2012 ISBN 978 3 486 71417 3 John Hughes Why functional programming matters In The Computer Journal Band 32 Nr 2 1989 S 98 107 englisch chalmers se abgerufen am 18 April 2017 Vorteile funktionaler Programmierung Zeigt Formen der Modularisierung die wesentlich auf Funktionen hoherer Ordnung und Bedarfsauswertung beruhen Miran Lipovaca Learn you a Haskell for great good A beginner s guide No Starch Press San Francisco 2011 ISBN 1 59327 283 9 englisch HTML Fassung abgerufen am 18 April 2017 Bryan O Sullivan Don Stewart John Goerzen Real world Haskell O Reilly Sebastopol 2008 ISBN 0 596 51498 0 englisch HTML Fassung abgerufen am 18 April 2017 Simon Peyton Jones Hrsg Haskell 98 Language and Libraries The Revised Report Cambridge University Press 2003 ISBN 0 521 82614 4 englisch haskell org Simon Thompson Haskell The craft of functional programming 3 Auflage Addison Wesley Harlow New York 2011 ISBN 978 0 201 88295 7 englisch Weblinks Bearbeiten nbsp Commons Haskell Sammlung von Bildern Videos und Audiodateien nbsp Wikibooks Funktionale Programmierung mit Haskell Lern und Lehrmaterialien nbsp Wikibooks Haskell Lern und Lehrmaterialien englisch haskell org zentrale Anlaufstelle zu der Programmiersprache Haskell mit Hinweisen zum Erlernen von Haskell interaktiver online Interpreter mit Tutorial englisch Einzelnachweise Bearbeiten Professor Paul Hudak s Website Memento vom 7 Juni 2011 im Internet Archive an der Yale University Haskell Announcing Haskell 2010 24 November 2009 abgerufen am 11 Januar 2023 The Haskell 98 Report Introduction Abgerufen am 31 Marz 2021 Bryan O Sullivan John Goerzen Donald Bruce Stewart Real World Haskell Code You Can Believe In O Reilly Media Inc 2008 ISBN 978 0 596 55430 9 S xxx Vorwort Haskell Die funktionale Programmiersprache im Portrait 28 Juli 2020 abgerufen am 30 Juni 2022 Jens Ohlig Hannes Mehnert Stefanie Schirmer Das Curry Buch Funktional programmieren lernen mit JavaScript O Reilly Germany 2013 ISBN 978 3 86899 370 7 S 144 Peter Pepper Funktionale Programmierung in OPAL ML HASKELL und GOFER Springer Verlag 1999 ISBN 978 3 642 98002 2 S 106 Wolfram Manfred Lippe Funktionale und Applikative Programmierung Grundlagen Sprachen Implementierungstechniken Springer Verlag 2009 ISBN 978 3 540 89108 6 S 209 haskell org The Glasgow Haskell Compiler Projekt Website Abgerufen am 9 Januar 2010 Hugs 98 Projekt Website Abgerufen am 9 Januar 2010 nhc98 Projekt Website Abgerufen am 9 Januar 2010 Niklas Rojemo nhc Nearly a Haskell Compiler PDF Chalmers Tech Report 1994 Atze Dijkstra Jeroen Fokker S Doaitse Swierstra The architecture of the Utrecht Haskell compiler In Haskell 09 Proceedings of the 2nd ACM SIGPLAN symposium on Haskell ACM New York NY 2009 S 93 104 doi 10 1145 1596638 1596650 Bastiaan Heeren Daan Leijen Arjan van IJzendoorn Helium for learning Haskell In Haskell 03 Proceedings of the 2003 ACM SIGPLAN workshop on Haskell ACM New York NY 2003 S 62 71 doi 10 1145 871895 871902 Normdaten Sachbegriff GND 4318275 6 lobid OGND AKS Abgerufen von https de wikipedia org w index php title Haskell Programmiersprache amp oldid 236482970