Door Toje Fos: Clojure is hier (security.nl) al eens eerder voorbij gekomen, volgens mij.
https://www.security.nl/posting/645208#posting645537Door Anoniem: Er zijn hierboven een paar functionele talen genoemd: Haskell, Lisp, Clojure.
Wat interessant is aan functionele talen is dat ze gebaseerd zijn op een wezenlijk andere manier van denken dan je van andere programmeertalen gewend bent. Daar wat van oppikken kan een verrijking zijn. Me ooit een tijdje in Haskell verdiepen leverde mij bijvoorbeeld op dat ik een ander perspectief kreeg op generators en generator expressions in Python, en ik denk dat dat mijn gebruik daarvan op een hoger plan heeft getrokken.
Dat voordeel merkte ik al tijdens leren en gebruik van Clojure op maar met Haskell is het inderdaad nog sterker.
Door Anoniem: Haskell is conceptueel lastig omdat het toegepaste wiskunde is van een hoger niveau dan je op de middelbare school meekrijgt. Voor je het weet ben je aan het opzoeken wat categorietheorie eigenlijk inhoudt, omdat je al snel tegenkomt dat concepten in Haskell in termen daarvan worden uitgelegd. Het uit zich ook in hoe de definitie van wat een functie in Haskell wiskundig zuiver gehouden is: het resultaat wordt puur uit de argumenten bepaald, de enige interactie tussen de functie en de buitenwereld van die functie loopt via de argumenten en het resultaat. Een functie is vrij van neveneffecten, in andere woorden.
Dat heeft vergaande consequenties. Een functie kan bijvoorbeeld geen I/O plegen, want iets uit een bestand of een database lezen, of iets naar stdout schrijven, zoals met 'print("Hello world")', is een interactie tussen de functie en de buitenwereld die buiten de argumenten en het aan de aanroeper teruggegeven resultaat om gaat. Dat kan nou juist niet niet in Haskell. Omdat een programmeertaal zonder I/O zinloos is hebben ze bij Haskell de truc bedacht om de buitenwereld niet te zien als iets dat buiten het programma zit maar als iets dat binnen een bijzonder soort objecten leeft.
Ze hebben dat geïmplementeerd met iets dat ze "monads" noemen, maar als je denkt dat je een "monad" snapt in termen van dit gebruik ervan dan sla je wat over, het is maar een van de toepassingen ervan. "Monad" is een concept uit de categorietheorie, en die heb je nodig om ze werkelijk te doorgronden. En dan moet je weer een brug zien te slaan tussen abstracte wiskundige concepten en de praktische toepassingen waar je een programmeertaal voor gebruikt.
Naah... Je kan prima programmeren in Haskell zonder category theory te beheersen (hoewel ik wel een paar boeken erover heb liggen, dat dan toch weer wel).
Door Anoniem: Ik haalde op het VWO tienen voor wiskunde, maar aan Haskell had ik een stevige kluif, en ik ben uiteindelijk afgehaakt, na er wel heel veel van geleerd te hebben. Misschien had ik last van die zware conceptuele achtergrond van Haskell omdat ik de neiging heb om erin te duiken, ik wil die achtergrond doorgronden. Wie weet valt het mee voor iemand die genoegen neemt met het leren van de patronen waarmee je het kan gebruiken, maar of dat zo is dat kan ik niet beoordelen.
Ik heb een paar boeken gekocht en ben er gewoon ingedoken (code schrijven). Je bouwt dan al snel een intuïtie op voor essentiële zaken als Functors, Applicatives, Monads, die je weer kan toetsen aan de boeken en verder verdiepen.
Door Anoniem: Met Lisp heb ik maar heel oppervlakkig te maken gehad, maar mijn indruk is dat dat de beschreven striktheid van Haskell niet heeft, en daardoor laagdrempeliger is. Dat zal dan ook voor Clojure gelden, dat is een Lisp-dialect.
Clojure is dynamically typed en dat lijkt leuk in het begin - zeker als je net zoals ik liever lui dan moe bent - maar mij is het uiteindelijk toch een beetje opgebroken. Het wordt allemaal wat wollig en op een gegeven moment merkte ik dat zelfs de makers van bepaalde libraries zelf eigenlijk niet precies wisten wat er gebeurde (door dat wollige karakter). Daarom ben ik overgestapt op Haskell en merkte uiteindelijk - steile leercurve - dat het gemakkelijker is in Haskell dan in Clojure om bv. code te refactoren en andermans of oude eigen code opnieuw op te pakken.