Krautkanal.com

Veröffentlicht am 2015-01-12 13:03:52 in /prog/

/prog/ 6357: Funktionales Programmieren - Haskell oder Clojure?

dutchnadia Avatar
dutchnadia:#6357

Bernd will gerne funktionales Programmieren lernen. Er hat zwei Kandidaten dafür: Haskell und Clojure.

Zum Anfang will Bernd ein einfaches Bilderbrett schreiben.

Vor- und Ratschläge?

Drin bevor Scheme, Lisp, SICP etc.

lanceguyatt Avatar
lanceguyatt:#6358

Nimm Haskell wenn du eine richtige (sprich: reine), funktionale Programmiersprache lernen möchtest.

Obligatorisch:
http://learnyouahaskell.com

chrstnerode Avatar
chrstnerode:#6359

Würde dir ein Haskell empfehlen, fand ich selbst sehr angenehm zu benutzen.

doooon Avatar
doooon:#6361

>>6357
Bernd kann auch nur für Haskell votieren, allerdings nur falls Bernd Yesod oder ein vergleichbares Framework zum luafen bekommt.
Das war damals nämlich eine Frickelei und da gab et sogar Fehler im Compiler, die das Verhinderten.

thehacker Avatar
thehacker:#6363

>>6358
> learnyouahaskell.com
http://bitemyapp.com/posts/2014-12-31-functional-education.html
findet das doof und empfiehlt stattdessen
http://www.seas.upenn.edu/%7Ecis194/spring13/index.html

creartinc Avatar
creartinc:#6367

>>6363
Man muss jetzt für sich selbst abwägen, ob das ein Sperglord ist, der versucht, Lernerfolge anderer und die Konsequenzen für die Lernmaterialien daraus zu beurteilen.

gmourier Avatar
gmourier:#6374

Haskell ist spaßig, aber darüber mit der echten Welt zu reden, nicht so. Clojure hab ich noch nicht gemacht, aber wird praktikabler sein.

albertaugustin Avatar
albertaugustin:#6375

>>6367
cis194 verlinkt direkt die passenden Kapitel aus Learn You A Haskell und Real World Haskell bei Relevanz. Das erste Kapitel bin ich durch und bisher ganz zufrieden.

>>6361
> Yesod oder ein vergleichbares Framework
Yesod scheint mir zu komplex. Ich werde happstack-lite oder snap versuchen.

> Das war damals nämlich eine Frickelei
cabal kann inzwischen schöne Sandboxen getrennt von allem anderen. Die Situation sollte sich also gebessert haben.

>>6374
> Clojure ... praktikabler
Denke ich auch, aber es ist sowieso nur ein Quatschprojekt. Ich kann ja immernoch wechseln, falls haskell sich als kapot herausstellt.

mizhgan Avatar
mizhgan:#6376

>>6375
>Yesod scheint mir zu komplex. Ich werde happstack-lite oder snap versuchen.
Gute Entscheidung. Neue Sprache plus fettes Framework mit seinen eigenen DSLs ist overload. Wenn du was ganz simples willst, im Stil von Sinatra, Flask usw, empfehle ich Scotty.

marciotoledo Avatar
marciotoledo:#6378

>>6375
>cabal kann inzwischen schöne Sandboxen getrennt von allem anderen. Die Situation sollte sich also gebessert haben.

Das war schon damals so, hat aber nichts gebracht. Das Problem war, dass die Versionsnummern der Abhängigkeiten nicht gepasst haben und dass es tatsächlich einen Bug im Compiler(!) gab, der Bernd daran gehindert hat Yesod zu benutzten.
Und wenn ich damals sage, meine ich vor ca. 1 Jahr.

>>6374
>funktionales Programmieren in Reinform
>praktikabel
nehme er eines

commoncentssss Avatar
commoncentssss:#6426

>>6363
http://www.seas.upenn.edu/%7Ecis194/spring13/lectures/02-ADTs.html
baz :: Person -> String
baz p@(Person n _ _) = "The name field of (" ++ show p ++ ") is " ++ n
*Main> baz brent
"The name field of (Person \"Brent\" 31 SealingWax) is Brent"


LG BRENT

hoangloi Avatar
hoangloi:#6557

Okay hier bei den abgedrehten Funktionalisten findet Bernd vielleicht jemanden, der ihm weiterhelfen kann.

Es geht um die Idee äh - wissensorientierter Programmierung. Nein nicht mit Proll-Log. Das System soll zum Beispiel gesagt kriegen "An Adresse xyz liegt jetzt ein im Bitschema Va.Ni.La organisierter Framebuffer der Dimension x*y*logc" und daraufhin seine bekannten Algorithmen anwenden und in diesen Buffer zeichnen.

Also, selbstprogrammierendes System sozusagen.

Dabei soll dann noch als Nebeneffekt weitgehende Exploitfreiheit, automagisches Debugging usw. rausfallen.

Hat das jemand schon mal gemacht? Wenn ja mit welchen Stichwörtern bzw. Elfenjungen muß Bernd suchen?

Bernd findet bei "Autoprogramming" nur Template-Generatoren und sowas. Das ist Müll und funktioniert natürlich gleich gar nicht.

syntetyc Avatar
syntetyc:#6561

>>6557
>Das System soll zum Beispiel gesagt kriegen "An Adresse xyz liegt jetzt ein [...] Framebuffer [...] und in diesen Buffer zeichnen.
Ja, und was soll es da hinein zeichnen? Bernd sieht gerade nicht den wesentlichen Unterschied zum üblichen OO-imperativen Image.render(buffer);.
>Das ist Müll und funktioniert natürlich gleich gar nicht.
Statt über die Ansätze anderer Leute zu lästern, könntest du doch erst einmal mehr als zwei Zeilen Erklärung zu deiner Idee liefern...

Säge, weil kein erkennbarer Bezug zum Fadenthema. Apropos, falls es doch eine längere Erläuterung geben soll, wird man sie bestimmt auch in einem eigenen Faden nicht übersehen. So schnell ist das Brett nun nicht.

chrisvanderkooi Avatar
chrisvanderkooi:#6562

render(buffer) setzt eine bestimmte Organisationsform desselben voraus.

Oder aber eine Ausprogrammierung von Eventualitäten (in render) etwa so:

// eine Zeile runter
currentAddress += buffer.VerticalAddressStride;

oder so:

// eine Zeile runter
currentAddress = buffer.Vertical1Down(currentAddress);



So. Und wenn Bernd das jetzt vorher wüßte wie sein Traum GENAU aussehen soll, würde er nicht fragen.

Das System soll aus generischen Algorithmen die von mir aus Kreise und Text rastern selbsttätig für den neuen Fall angepaßte machen, oder anders ausgedrückt, es weiß wie man einen Kreis rastert, es kennt die Specs der neuen Grafikhardware -> es kann selbsttätig einen Kreis auf die neue Grafikhardware plotten

Ebenso: "Treiber"? Wird ersetzt durch eine Spec der Schnittstelle.

So ähnlich wie die RTL von gcc, auch wenn die extrem angepaßt ist auf die gcc-Zwecke.

So 5% davon hat Bernd auch schon in Multimedia-Frameworks oder Druckeranbindungen gesehen. Bekannt ist wie aus MP3 PCM wird, bekannt ist wie PCM in laute Töne gemacht wird, also geht auch MP3 in laute Töne

malgordon Avatar
malgordon:#6563

Warum nicht einfach Python nehmen?

hota_v Avatar
hota_v:#6564

Haskell ist zum Lernen funktionaler Programmierung und Typentheorie großartig und hat viele gute Bibliotheken. Monadentransformer sind aber äußerst nervig und vieles muss im voraus geplant werden, wenn man sich nicht ewig auf Fibonaccigeneratoren beschränken will. Dazu kommt, dass die Sprache nicht strikt ist, was das Verständnis erschwert: Es ist z.B. nicht jedem sofort ersichtlich, warum [code]foldl (+) 0 [1..100000000][/code] mehrere GB Speicher und Minuten braucht, während [code]foldl' (+) 0 [1..100000000][/code] effizient und fast sofort fertig ist.

Clojure ist ziemlicher Dreck, weil sich die JVM nicht mit funktionaler Programmierung verträgt. Als ich das letzte Mal nachsah, hatten Fehlermeldungen immernoch absolut nichts mit dem geschriebenen Kot zu tun und ähnelten eher einem Kernlager, nur auf JVM-Niveau. Explizite Schwanzrekursion ist auch nicht gerade toll und die Sprache scheißt auf den Lispgeist™, also kriegt man nicht mal da was für sein Geld. Würde es generell nicht empfehlen, insbesonders nicht fürs Lernen.
Zugegebenerweise ist das aber schon eine Weile her und ich weiß nicht, wieviel sich da inzwischen geändert hat.

clementc Avatar
clementc:#6572

Haskell ist natürliche recht nett, aber bei clojure profitiert man neben dem Konzept der funktionalen Programmierung auch noch von den vielen tollen Konzepten die LISP so mit sich bringt. Wenn du noch nie ein LISP-Dialekt benutzt hast würde ich dir dazu raten clojure zu lernen.

Neuste Fäden in diesem Brett: