Spaß mit Haskell
Ich bin ja seit einer Weile auf der Suche nach einer faszinierenden, effektiven Programmiersprache, und habe mich deshalb mit Lua und Python beschäftigt. Nicht ins Blog geschafft hat es erlang, obwohl das eine wirklich faszinierende Sprache ist. Zumindest unter FreeBSD hat sie aber Abhängigkeiten zu Java, und das fand ich ganz schön abschreckend. Ich weiß, das Erlang damit nichts am Hut hat, ich konnte aber nicht in Erfahrung bringen, ob es auf der JVM aufsetzt, oder nur zum Build notwendig ist.
Lua ist eine schöne, kleine Sprache mit einem eleganten Sprachschatz. Hier hatte ich bedenken, ob es möglich ist, größere Projekte stabil zu verwirken, Shell- und Perlscripte neigen ja auch dazu, irgendwann instabil zu werden. Ja, ich weiß, mit der nötigen Disziplin kann man das umgehen, und mit der ZSH habe ich eine Shell gefunden, die sowohl eine mächtige Scriptsprache wie auch ein einfaches Typesystem zur Verfügung stellt. Von echten Arrays und Hashes mal abgesehen. :-)
Wie ich genau eigentlich auf Haskell kam, weiß ich nicht genau. Auf jeden Fall stolperte ich über einige Tutorials im Netz, bei denen ich zwischendurch echt Kopfschmerzen bekam. Gut, sich eingangs mit dem Lambda Kalkül (Wikipedia) zu beschäftigen ist trocken und recht unverständlich, obwohl es mit Das gefürchtete Lambda Kalkül eine nette Einführung gibt (danke nochmal Rhalina für den Link!)
Dann kam aber das Buch Real World Haskell vom O'Reilly Verlag, und letzte Tage bin ich über Learn You A Haskell gestolpert. Seitdem experimentiere ich mit Lazyness, Lists und List comprehensions. Ich bin also quasi im 1. Kapitel von Learn You A Haskell<> (LYAH), und im 3. Kapitel von Real World Haskell (RWH).
Ja, und seitdem beseelt mich bei der Beschäftigung mit dieser Sprache sowas wie kindliche Begeisterung. Um nicht zu sagen: Haskell ist cool. Lazyness ist ein echt nützliches Werkzeug, und Haskell erweist sich als sehr ausdrucksstarke Sprache:
Nehmen wir z.B. eine Reihe von Listen, die Tiere enthalten:
Lua ist eine schöne, kleine Sprache mit einem eleganten Sprachschatz. Hier hatte ich bedenken, ob es möglich ist, größere Projekte stabil zu verwirken, Shell- und Perlscripte neigen ja auch dazu, irgendwann instabil zu werden. Ja, ich weiß, mit der nötigen Disziplin kann man das umgehen, und mit der ZSH habe ich eine Shell gefunden, die sowohl eine mächtige Scriptsprache wie auch ein einfaches Typesystem zur Verfügung stellt. Von echten Arrays und Hashes mal abgesehen. :-)
Wie ich genau eigentlich auf Haskell kam, weiß ich nicht genau. Auf jeden Fall stolperte ich über einige Tutorials im Netz, bei denen ich zwischendurch echt Kopfschmerzen bekam. Gut, sich eingangs mit dem Lambda Kalkül (Wikipedia) zu beschäftigen ist trocken und recht unverständlich, obwohl es mit Das gefürchtete Lambda Kalkül eine nette Einführung gibt (danke nochmal Rhalina für den Link!)
Dann kam aber das Buch Real World Haskell vom O'Reilly Verlag, und letzte Tage bin ich über Learn You A Haskell gestolpert. Seitdem experimentiere ich mit Lazyness, Lists und List comprehensions. Ich bin also quasi im 1. Kapitel von Learn You A Haskell<> (LYAH), und im 3. Kapitel von Real World Haskell (RWH).
Ja, und seitdem beseelt mich bei der Beschäftigung mit dieser Sprache sowas wie kindliche Begeisterung. Um nicht zu sagen: Haskell ist cool. Lazyness ist ein echt nützliches Werkzeug, und Haskell erweist sich als sehr ausdrucksstarke Sprache:
Nehmen wir z.B. eine Reihe von Listen, die Tiere enthalten:
animals=["hund","katze","maus"] animals'=["elephant","hai","huhn"] animals''=["schnecke","grashuepfer","marienkaefer"] carnivores=["hund","katze","tiger","loewe","baer","hai"] fishes=["hai","delphin","lachs","goldfisch"]Werden diese Listen in den Interpreter ghci geladen, kann man mit ihnen interessante Dinge ohne großen Aufwand anstellen:
*Main> [ x | x <- animals, x `elem` carnivores ] ["hund","katze"] *Main> [ x | x <- animals', x `elem` fishes ] ["hai"] *Mai>Hier wird praktisch die Liste animals ausgelesen und damit eine neue Liste erzeugt, wobei nur Elemente berücksichtigt werden, die auch in der Liste carnivores vorkommen. Im zweiten Beispiel werden aus der Liste animals' die Fische extrahiert. Das finde ich schonmal schick ausdrucksstark.
cptsalek - 17. Apr, 15:03
qs [] = []
qs (x:xs) = let lt = [x' | x' <- xs, x' < x]
gt = [x' | x' <- xs, x' >= x]
in qs lt ++ [x] ++ qs gt
Und damit die kürzeste Implementierung dieses Problems, die ich bisher gesehen habe. ^^