Ein bisschen wie LEGO®

May 10, 2014

Intro

Warum Haskell wie Lego?

Beim Vorbereiten meines Vortrags habe ich überlegt wie ich Leuten so etwas abstraktes wie Haskell erkläre, ohne dass ich Programmierkenntnisse voraussetze. Dabei ist mir beim Thema “Immutability” eine Stelle aus “Sophies Welt” eingefallen, in der das griechische Atommodell mit Lego verglichen wurde. Ausgehend von dieser Idee sind mir immer mehr Parallelen zwischen diesen beiden Dingen eingefallen und ihr müsst euch den Blödsinn jetzt anhören.

Schlagwörter

  • Pure
  • Stark typisiert
  • Statisch typisiert
  • Lazy
  • Funktional

Haskell ist “pure”

Pure

Wie auch Legosteine sind Haskell Variablen unveränderlich, wer einen Baustein anderer Form/Farbe benötigt muss den alten wegwerfen (Garbage-Collecten) und einen neuen Baustein suchen/eine neue Instanz erzeugen.

Das heißt auch, dass Konstrukte und Abstraktionen anderer Programmiersprachen wie for-Schleifen oder x++ nicht existieren.

Wie löst man ebendiese Probleme?

  • Rekursion
  • Higher-Order-Functions
  • lokalen Variablen
  • Datenstrukturen wie Listen, Bäumen etc.

Haskell ist stark typisiert

Stark typisiert

So wie jeder Legostein eine fixe Länge, Breite und Farbe hat, so besitzt alles in Haskell einen Typ. Lego (1 × 4) Red ist vom Typ Lego (geschrieben :: Lego). Diese Typen werden vom Compiler überprüft, d.h. wo in meinem Quellcode ein Lego erwartet wird kann ich keinen Duplo Baustein verwenden.

Beispiele

Ein paar Beispiele die man am besten im Interpreter ghci ausprobiert. Also unter MSWindows winghci.exe ausführen oder unter Unix ein Terminal öffnen und ghci aufrufen.


Haskell ist statisch typisiert

Statisch typisiert

Wo in anderen Programmiersprachen der Buchstabe 'a' auch als Zahl verwendet werden kann und man 'a'+3 berechnen kann und 'd' erwartet, erhält man in Haskell eine Fehlermeldung, dass der Operator (+) zwei Zahlen vom gleichen Typ erwartet.


Auch die putStrLn-Funktion erwartet einen String, den sie auf der Kommandozeile ausgibt und macht keine implizite Umwandlung, d.h.

Alles hat einen Typ

Auch Funktionen haben einen und der wird in einer Datei z.B. MyFile.hs meistens dazugeschrieben:

  • f :: Int -> Int -> Int
    heißt: f nimmt einen Int und auch einen zweiten Int und liefert (das ist immer das letzte Dings in so einer Zeile) einen Int
  • man verwendet Klammern nur da wo sie notwendig sind

Eigene Typen

Haskell erlaubt es auch sich eigene Typen auszudenken.

Haskell ist funktional

Funktional

Funktionen haben keinen besonderen Status, man kann sie wie jeden anderen Typ in Variablen speichern, in Listen packen oder als Parameter in anderen Funktionen verwenden.

WTF ist Funktional in LEGO

Baupläne! Baupläne sind genauso wie Haskell-Funktionen, immer gleich. Soll heißen wenn ich einen Bauplan zwei mal hintereinander ausführe kommt das geiche Modell heraus bzw. bei Haskell der gleiche Wert.

Weiters werden in Baupläne kleine Teilbaupläne verwendet - auch in Haskell-Funktionen werden kleinere Funktionen als “Bausteine” verwendet.

Beispiele

Haskell ist “lazy”

Lazy

So wie beim Bau eines Lego-Hauses, wo ich ein Bauteil erst dann suche wenn ich es benötige, wird auch in Haskell Zeug erst dann ausgewertet wenn es gebraucht wird.


Nochmal lazyness in Action

Noch einmal Legos

GHCi


Was brauche ich zum herumspielen?

Compiler

  • Einen funktionierenden Compiler/Interpreter am besten Haskell-Platform herunterladen und installieren
  • Compiler gibt es mehrere, der mit Abstand populärste ist GHC
  • Interpreter gibt es auch einige, aber außer GHCi sind alle veraltet

Editor

  • Vim + Plugins (Syntastic, ghc-mod, haskellmode, hdevtools, lushtags)
  • Emacs + Plugins (ghc-mod)
  • Eclipse + EclipseFP
  • FPComplete hat einen online editor

Bücher

Blogs & Podcasts

Sonstige Tools

  • HLint - ein ausgezeichnetes Tool das Codestyle verbessert
  • Hackage - das zentrale Code-Repository
  • Cabal - der Paketmanager von Haskell
  • Hoogle - eine Suchmaschine die es ermöglicht nach Funktionen zu suchen
  • Hayoo - noch eine Suchmaschine, die noch mehr Pakete durchsucht
  • www.stackoverflow.com