Die Werkzeuge
| Werkzeug | Zweck |
|---|---|
| GHC | der Compiler (ghc -O2 Main.hs) |
| GHCi | interaktive Umgebung zum Ausprobieren |
| Cabal | Build-System und Paketmanager (cabal build, cabal run, cabal test) |
| Stack | Alternative zu Cabal mit festen Paketmengen (Stackage) |
| GHCup | Installationsprogramm für GHC, Cabal, Stack, HLS |
| HLS | Haskell Language Server (Editor-Unterstützung) |
| Hackage / Hoogle | Paketarchiv / Funktionssuche nach Typ (hoogle.haskell.org) |
| HLint, Ormolu/Fourmolu | Stil-Tipps und Formatierer |
cabal init --interactive # neues Projekt
cabal build
cabal run mein-projekt
cabal repl # GHCi mit Projekt
cabal test
cabal install --lib containersDie mein-projekt.cabal-Datei:
cabal-version: 3.0
name: mein-projekt
version: 0.1.0.0
executable mein-projekt
main-is: Main.hs
hs-source-dirs: app
build-depends: base ^>=4.18, containers, text
default-language: Haskell2010
ghc-options: -WallGHCi: wichtige Befehle
ghci> :t map -- Typ anzeigen
map :: (a -> b) -> [a] -> [b]
ghci> :i Maybe -- Informationen zu einem Namen
ghci> :l Datei.hs -- laden
ghci> :r -- neu laden
ghci> :k Maybe -- Kind (Typ von Typen)
ghci> :qHoogle: Suche nach der Typsignatur, z. B. [a] -> Int findet length.
Häufig genutzte Erweiterungen
{-# LANGUAGE OverloadedStrings #-} -- String-Literale als Text
{-# LANGUAGE LambdaCase #-} -- \case Muster
{-# LANGUAGE TupleSections #-} -- (,x)
{-# LANGUAGE ScopedTypeVariables #-} -- Typannotationen in Mustern
{-# LANGUAGE RecordWildCards #-} -- Person{..}
{-# LANGUAGE DeriveFunctor #-} -- deriving Functor{-# LANGUAGE LambdaCase, TupleSections, RecordWildCards #-}
data Konfig = Konfig { host :: String, port :: Int }
beschreibe :: Konfig -> String
beschreibe Konfig {..} = host ++ ":" ++ show port
status :: Int -> String
status = \case
200 -> "OK"
404 -> "Nicht gefunden"
_ -> "anderes"
main :: IO ()
main = do
putStrLn (beschreibe (Konfig "localhost" 8080))
print (map status [200, 404, 500])
print (map (,True) [1, 2])Ausgabe
localhost:8080 ["OK","Nicht gefunden","anderes"] [(1,True),(2,True)]
Typklassen- und Funktionsübersicht
| Thema | Wichtige Namen |
|---|---|
| Listen | map filter foldr foldl' zip zipWith take drop takeWhile span concat concatMap |
| Zahlen | + - * / div mod quot rem ^ ** sqrt fromIntegral round floor ceiling |
| Text | show read words unwords lines unlines ++ concat |
| Maybe/Either | Just Nothing maybe fromMaybe Left Right either |
| Funktionen | id const flip . $ <$> <*> >>= uncurry curry |
| IO | putStrLn print getLine readFile writeFile mapM_ forM_ when |
| Vergleich | == /= < > compare max min |
Häufige Fehlermeldungen
| Meldung | Ursache |
|---|---|
Couldn't match expected type ‘Int’ with actual type ‘[Char]’ | falscher Typ: Signatur und Ausdruck passen nicht |
No instance for (Show a) arising from ... | Show a => in der Signatur fehlt |
Variable not in scope | Tippfehler oder fehlender import |
Non-exhaustive patterns in function f | nicht alle Fälle abgedeckt (-Wall warnt) |
parse error on input | Einrückung/Syntax; where, let ausrichten |
Ambiguous type variable | Typ nicht eindeutig: (read x :: Int) |
Occurs check: cannot construct the infinite type | Funktion wird falsch angewendet |
Couldn't match type ‘IO’ with ‘[]’ | do-Block mit gemischten Monaden |
Weiterlernen
- Learn You a Haskell for Great Good! (learnyouahaskell.com) und Haskell Programming from First Principles
- Real World Haskell, Parallel and Concurrent Programming in Haskell
- Übungen: Exercism (Haskell-Track), Advent of Code, 99 Haskell Problems
- Wiki dieser Seite: Artikel zu funktionaler Programmierung
Merke
- Typen führen: erst die Signatur, dann die Definition
map/filter/foldstatt Schleifen, Pattern Matching stattif-KettenMaybe/Eitherstatt null und Exceptions; IO am Rand des Programms- Cabal/Stack, Hoogle und
-Wallsind deine Werkzeuge