[[Vorlage(Getestet, focal)]] {{{#!vorlage Wissen [:Pakete installieren: Installation von Programmen] [:Terminal: Ein Terminal öffnen] }}} [[Inhaltsverzeichnis()]] [[Bild(haskell.png, 64, align=left)]] [https://www.haskell.org Haskell] {en} ist eine [wikipedia:Polymorphie_(Programmierung):polymorphe], [wikipedia:Statische_Typisierung:statisch typisierte] und [wikipedia:Funktionale_Programmiersprache#Rein_funktionale_Programmiersprachen:rein funktionale Programmiersprache]. Ausdrücke werden nur bei Bedarf ausgewertet ([wikipedia:Lazy Evaluation:"lazy evaluation"]). Der Name kommt vom Logiker [wikipedia:Haskell Curry:]. Haskell baut auf dem [wikipedia:Lambda-Kalkül:], einer formalen Sprache zur Untersuchung von Funktionen, auf. Daher kommt auch das Logo in Form eines Lambdas. = Installation = == GHC == Der Haskell-Compiler GHC (The Glorious '''G'''lasgow '''H'''askell '''C'''ompilation system) kann direkt aus den Quellen installiert werden: [1] {{{#!vorlage Paketinstallation ghc, universe }}} Er bietet mit dem Befehl `ghci` einen interaktiven Modus, um Code direkt im Interpreter auszuführen. == Haskell-Platform == Stattdessen kann auch direkt die Haskell-Platform, eine Zusammenstellung von Werkzeugen und Bibliotheken rund um Haskell, installiert werden: {{{#!vorlage Paketinstallation haskell-platform, universe }}} Inbegriffen sind u.a.: * GHC * Alex, ein Generator für lexikalische Scanner, ähnlich zu [wikipedia:Lex_(Informatik):Lex] * Happy, ein Generator für Parser/Compiler, ähnlich zu [wikipedia:Yacc:] * Cabal, ein Paketmanager * Haddock, ein Dokumentationswerkzeug * hsc2hs, ein Vorprozessor um Haskell- und [:Programmiersprache#C:C]-Code gemeinsam zu nutzen * weitere Bibliotheken, wie zlib, cgi und OpenGL == Weitere Compiler == Weitere Compiler sind auf Wikipedia zusammengefasst: [wikipedia_en:Haskell_(programming_language)#Implementations:Haskell - Implementations] - Die meisten davon sind nicht in den Standardquellen verfügbar. = Bedienung = Haskell-Programme können sowohl über den Interpreter geschrieben werden, als auch direkt ausgeführt werden. Ein Kompilieren zu Bytecode ist ebenfalls möglich. == Interpreter == Der interaktive Interpreter kann mit dem Aufruf von {{{#!vorlage Befehl ghci }}} im Terminal[2] gestartet werden. Der Interpreter erfasst die Befehle erst mal nur zeilenweise. Mehrzeilige Anweisungen müssen in einem speziellen Block `:{` `:}` geschrieben werden. [[Bild(ghci.png, 300, align=right)]] {{{#!vorlage Hinweis Im interaktiven Modus müssen alle Zuweisungen (auch die von Funktionen) mit `let` erfolgen. }}} === Beispiel 1 === Die Fakultät kann z.B. mit der product-Funktion aus der Standardbibliothek (Prelude) errechnet werden: {{{#!vorlage Befehl let factorial n = product [1..n] }}} Die Funktion kann beispielsweise mit der Zahl 10 aufgerufen werden. Dies geschieht mit dem Befehl: {{{#!vorlage Befehl factorial 10 }}} === Beispiel 2 === Ohne die Standardbibliothek zu nutzen, kann folgende rekursive Funktion das Problem lösen: {{{#!vorlage Befehl :{ let { factorial 0 = 1; factorial n = n * factorial (n - 1); } :} }}} Der Aufruf erfolgt wie bei Beispiel 1. Da der Code zwischen den Blockmarkern in eine einzige Zeile eingelesen wird, müssen die Befehle durch einen Semikolon `;` getrennt werden. Eine Einrückung ist im normalen Code zwingend, entfällt aber dadurch, dass alles letztendlich in einer Zeile steht. === Beispiel 3 === Da Haskell nur bei Bedarf die Ausdrücke auflöst ("lazy evaluation"), kann auf einfache Weise mit unendlich großen Mengen gearbeitet werden. Hier werden die ersten zehn geraden Zahlen aus einer unendlichen Liste (null bis unendlich) ausgegeben: {{{#!vorlage Befehl take 10 [x | x <- [0..], x `mod` 2 == 0] }}} == Quelldatei == Wie bei anderen Skriptsprachen, kann auch Haskellcode direkt in eine Datei geschrieben und ausgeführt werden. Die Datei wird dann mit dem Interpreter direkt ausgeführt[2]: {{{#!vorlage Befehl ghc HASKELLDATEI.hs }}} === Beispiel 1 === Ein einfaches Hello-World-Programm: {{{#!code haskell -- Einfaches Hello-World Beispiel. main :: IO () main = putStrLn "Hello, World!" }}} Es gehört zum guten Stil, zu allen Funktionen entsprechende Typdeklarationen zu schreiben (entsprechend die erste Zeile `main :: IO ()`). === Beispiel 2 === Die Fakultät wird hier je nach Benutzereingabe berechnet: {{{#!code haskell factorial :: Int -> Int factorial n -- anstatt "Pattern matching" werden | n == 0 = 1 -- hier "Guards" (mit '|') verwendet | otherwise = n * factorial (n - 1) main :: IO () main = do putStrLn "Welche Fakultät soll berechnet werden?" n <- getLine putStrLn . show $ factorial $ read n }}} === Beispiel 3 === Hier wird ebenfalls die Fakultät berechnet, das vorherige Beispiel allerdings noch gegen fehlerhafte Benutzereingaben abgesichert. {{{#!code haskell import Data.Maybe factorial :: Integer -> Integer -- Integer hat keine Größenbeschränkung factorial 0 = 1 -- im Gegensatz zu Int factorial n = n * factorial (n - 1) maybeRead :: Read a => String -> Maybe a maybeRead s = case reads s of [(x, "")] -> Just x _ -> Nothing getIntfromString :: String -> Maybe Integer getIntfromString str = maybeRead str main :: IO () main = do putStrLn "Welche Fakultät soll berechnet werden?" input <- getLine let maybeInt = getIntfromString input in case maybeInt of Just n -> if (n >= 0) then putStrLn $ "Das Ergebnis von " ++ show n ++ "! ist: " ++ show (factorial n) else error "Keine positive Zahl übergeben!" Nothing -> error "Keine Ganze Zahl übergeben!" }}} Ab GHC 7.6 existiert die Funktion `maybeRead` bereits im Modul [https://downloads.haskell.org/~ghc/7.6-latest/docs/html/libraries/base/Text-Read.html Text.Read] {en}. = Links = * [https://www.haskell.org Haskell] {en} * [https://www.haskell.org/ghc/docs/7.4-latest/html/libraries/index.html Haskell Hierarchical Libraries] {en} - Bibliotheksindex * [http://learnyouahaskell.com/chapters Learn You a Haskell for Great Good!] {en} - Kurzweiliges Einsteigertutorial * [https://wiki.haskell.org/Hitchhikers_guide_to_Haskell Hitchhikers guide to Haskell] {en} * [:Programmierung:] {Übersicht} * [youtube:R-K8l4X8F54:Haskell in 20 min] {de} - Video-Vortrag von Robert Clausecker - Ubucon 2012 #tag: Programmierung