Hasdrubal
Legacy Member
Hale zei:om nog even terug te komen op die haskell :
het interessante aan die taal is eigenlijk het achterliggende gedachtengoed/ paradigma : nl. functioneel programmeren. In functionele programma's bestaat alles uit functies en vooral : die functies vertonen geen side-effects. Wat wil dat zeggen : een functie doet niks anders dan een return value berekenen. Ze past geen argumenten aan, ze past geen globale variabelen aan, er wordt geen state bijgehouden, etc.
Dit leidt tot heel interessante eigenschappen. Zo zal voor een functie f voor een bepaalde variabele x gelden : f(x) = f(x).
Dit lijkt misschien logisch maar is het allesbehalve in een imperatieve taal. volgend stukje pseudo code maakt dit duidelijk :
Code:global var i = 0; functie f (int x) { i = i + 1; return x+ i; }
als je nu f(x) tweemaal oproept met dezelfde x dan zal ze tweemaal een ander resultaat geven. In een functionele stijl/taal kan dit dus niet voorvallen aangezien je daar alleen de returnwaarde mag berekenen en niks anders aanpassen.
Hierdoor kan een compiler vanalles gaan optimaliseren
bv. het volgende stukje code :
kan vervangen worden door :Code:y = f(x) + f(x)
zodat een mogelijk kostelijke functie oproep maar 1 keer uitgevoerd hoeft te worden.Code:z = f(x) y = z+z
een ander voordeel is dat je functies thread safe zijn. Je moet niet vanalles liggen synchronized maken zoals je in java zou doen want er is helemaal niets dat kan upf*cken als twee threads tegelijk dezelfde methode uitvoeren. Zulk een taal is dus uitermate geschikt om te parallelliseren.
Als laatste laat het ook toe om je code zogenaamd "lazy" uit te voeren. Een functie wordt pas geëvalueerd wanneer ze daadwerkelijk nodig is. Dit laat je bv toe om oneindige recursieve data structuren te definiëren (bv. oneindig doorlopende bomen ) omdat die niet volledig geëvalueerd worden. Dit is onmogelijk in imperatieve talen.
dit is raar op een manier echt wel!