Was ist Haskell?
Haskell (benannt nach Haskell Curry, erster Standard 1990) ist eine rein funktionale, statisch typisierte Sprache mit Lazy Evaluation (Werte werden erst berechnet, wenn man sie braucht). Es gibt keine Variablen im üblichen Sinn und keine Schleifen: Programme bestehen aus Funktionen, die aus Eingaben Ausgaben berechnen, ohne Nebenwirkungen. Der Compiler (GHC) findet durch das starke Typsystem viele Fehler vor dem Start.
Haskell wird in Compilern, Finanzsoftware (Standard Chartered, Jane Street nutzt OCaml), Blockchain-Projekten (Cardano), Pandoc, Xmonad und vor allem in Forschung und Lehre eingesetzt. Wer Haskell versteht, programmiert auch in anderen Sprachen besser: Ideen wie map/filter, Pattern Matching, Optional-Typen und Immutability stammen aus der funktionalen Welt.
Installation und Ausführen
Installiere GHCup (haskell.org/ghcup), das GHC, Cabal und Stack bereitstellt.
ghci # interaktive Umgebung (Ausdrücke direkt testen)
runghc Hallo.hs # Datei wie ein Skript ausführen
ghc Hallo.hs && ./Hallo # kompilieren und starten
cabal run # Projekt startenDas erste Programm
main :: IO ()
main = do
putStrLn "Hallo Haskell!"
putStrLn ("2 + 3 = " ++ show (2 + 3))
print (length "Haskell")
print [1, 2, 3]
print "Text mit Anführungszeichen"Ausgabe
Hallo Haskell! 2 + 3 = 5 7 [1,2,3] "Text mit Anf\252hrungszeichen"
main :: IO ()ist die Typsignatur:mainführt Ein-/Ausgabe (IO) aus und liefert nichts (())putStrLngibt Text mit Zeilenumbruch aus,printzeigt jeden Wert (show)++verbindet Listen und Texte- Kommentare:
-- bis Zeilenende,{- mehrzeilig -} - Die Einrückung gliedert Blöcke (wie in Python)
Ausdrücke statt Anweisungen
In Haskell ist fast alles ein Ausdruck mit Wert, auch if:
main :: IO ()
main = do
print (3 + 4 * 2)
print (if 5 > 3 then "ja" else "nein")
print (let a = 10; b = 20 in a * b)
print (max 3 9, min 3 9)
print (7 `div` 2, 7 `mod` 2, 7 / 2)
print (2 ^ 10, 2 ** 0.5, sqrt 16, pi)
print (True && False, True || False, not True)
print (succ 'a', pred 10, fromEnum 'A', toEnum 66 :: Char)
print (show 42 ++ "!", read "7" + 1)
print (compare 1 2, 3 == 3, 3 /= 4)Ausgabe
11
"ja"
200
(9,3)
(3,1,3.5)
(1024,1.4142135623730951,4.0,3.141592653589793)
(False,True,False)
('b',9,65,'B')
("42!",8)
(LT,True,True)Funktionsaufrufe schreibt man ohne Klammern: max 3 9 statt max(3, 9). Der Aufruf bindet am stärksten: f x + 1 bedeutet (f x) + 1. Mit Backticks wird eine Funktion zum Infix-Operator: `7 div 2`.
So führst du den Code aus: Im Browser mit dem Haskell-Playground (play.haskell.org) oder lokal mit GHC: ghc Hallo.hs && ./Hallo, interaktiv mit ghci.
Merke
- Haskell ist rein funktional, statisch typisiert und lazy
main :: IO ()ist der Einstiegspunkt;dofasst mehrere IO-Aktionen zusammen- Ausdrücke haben Werte, auch
ifundlet - Funktionsaufruf ohne Klammern:
f x y ghcizum Ausprobieren,runghcfür Skripte
Aufgabe
Gib mit putStrLn und show das Ergebnis von 6 * 7 aus.