Leuke vraag

. Altijd leuk om op dit forum een keertje Haskell tegen te komen

.
Gokje: je studeert zeker aan de Universiteit Utrecht?
Ik kan eigenlijk niet echt antwoord geven op je vraag. Ik zit niet in het bedrijfsleven en heb er ook geen zicht op in welke mate Haskell wordt toegepast. Wel kan ik je vertellen waarom ik vind dat Haskell uitstekend toegepast zou kunnen worden. Waarom het eventueel niet toegepast zou worden?: gebrekkige kennis, niet al te eenvoudige combinatie met andere paradigma's. In .NET kan je ook (een soort?) Haskell gaan gebruiken. Wellicht dat dit een goede stimulans zal zijn.
Allereerst wordt Haskell vaak een declaratieve taal genoemd. Declaratief is echter een extreem slecht gedefinieerde notie. Wat is declarativiteit? Vaak wordt er gezegd dat een taal declaratief is als je
niet beschijft
hoe de computer iets moet doen,
maar wat de computer moet doen. Een compiler moet dan maar uitvogelen hoe dit gedaan moet worden. Een imperatieve taal is volgens deze definitie geen declaratieve taal omdat je in feite exact opgeeft hoe een computer iets moet doen.
Eigenlijk vind ik dit geen aangename definitie. Ik vind namelijk dat een taal helemaal niet declaratief is in het paradigma van deze taal. Je geeft namelijk binnen het model van dit paradigma precies aan hoe iets moet gebeuren. Een taal is dan ook alleen declaratief ten opzichte van een ander paradigma. Functionele talen kan je daarom declaratief noemen ten opzichte van het imperatieve paradigme. Ten opzichte van dit paradigma geef je aan
wat er moet gebeuren. In het paradigma van de taal zelf geef je aan
hoe iets moet gebeuren. Omdat alle paradigma's worden vergeleken met het imperatieve paradigma worden vaak alle andere paradigma's declaratief genoemd. Mijn interpretatie nuanceert dat een beetje

.
Mijn aangepaste definitie komt eigenlijk voort uit het bewijzen van programma-correctheid. Er wordt namelijk weleens beweert dat een programma geschreven in functionele taal geen bewijs nodig heeft voor correctheid. Dit argument komt voor uit de aanname dat deze taal declratief is en dus beschijft wat er moet gebeuren. Een bewijs van correctheid vergelijkt over het algemeen
wat er moet gebeuren met
hoe iets moet gebeuren. Als er alleen maar een 'wat er moet gebeuren' is, valt er natuurlijk ook niets te bewijzen! Maar goed, iedereen die ooit weleens in Haskell gewerkt heeft zal weten dat je ook daarin makkelijk een incorrect programma kan maken. Neem bijvoorbeeld een stukje code die een lijst zou moeten sorteren, maar dit niet goed doet. In principe is dit programma een vertaling vanuit een specificatie-paradigma: je geeft aan wat je wilt bereiken met het programma. Je geeft in Haskell code aan hoe dit moet gebeuren (let op het woordje 'hoe'!). Ik vind dat je altijd de correctheid van een programma moet bewijzen als je vanuit het ene paradigma op het andere paradigma over gaat.
Als je namelijk een 'wat er moet gebeuren' beschrijving hebt in een functioneel paradigma en je implementeert dit in een imperatief paradigma, dan heb je een bewijs nodig dat deze implementatie voldoet aan je specificatie. Als je echter een 'wat er moet gebeuren' beschrijving hebt in een functioneel paradigma en je implementeert dit in Haskell, dan is er geen bewijs nodig. Je blijft namelijk in hetzelfde paradigma, of anders gezegd: je specificatie is je implementatie.
Wat is Haskell nu eigenlijk?
Haskell is een hogere-orde functionele taal. Dit betekent dat Haskell twee belangrijke features heeft:
1.
Hogere orde functies: functies zijn toegestaan als argumenten van andere functies of als return waarden.
2.
Geneste functies met lexical scope: een functie kan een sub-functie bevatten, waarbij de sub-functie de variabelen van de omringende functie kan gebruiken. Deze sub-functie kan ik een hogere-orde functionele taal ook worden opgeleverd als een resultaat.
Samen vormen deze twee features een uitermate aantrekkelijk paradigma, waarin je uitermate goed generieke code kunt schrijven. Een hele interessante feature van Haskell is de partiele parameterizatie van een functie: Stel dat je de functie 'add' hebt met als type: Int -> Int -> Int (er komt een int in, nog een int en er komt een int uit). De code 'add 5' is nu een partieel geparameterizeerde functie en dit is zelf ook weer een functie, namelijk een functie van Int -> Int. Deze functie telt bij een gegeven Int, 5 op.
Een ander belangrijk aspect is het ontbreken van side-effects: variabelen zijn altijd immutable. Dit heeft grote voordelen voor het bewijzen van correctheid en biedt ook interessante mogelijkheden tot optimalisering en uitgebreidde analyse in een compiler.
Haskell leent zich uitstekend voor het
handmatig schrijven van parsers met behulp van parser-combinators. Met behulp van parser-combinators kan je op een hele eenvoudige manier een parser schrijven (in feite: samenstellen). Dit is een hele aantrekkelijke manier van het schrijven van een parser die interessante mogelijkheden biedt. In de praktijk wordt een parser inderdaad altijd gegeneerd uit een gegeven grammatica. Parser combinators zijn echter wel een leuk alternatief die ook zeker voordelen hebben.
Tja, ik kan nog wel even doorpraten over al de leuke features van Haskell maar dan wordt dit wel een heel erg lang verhaal

. Waarschijnlijk is dit hierboven al complex genoeg. Als je ergens meer over wilt weten moet je daar maar even specifieker naar vragen.
Het is in ieder geval belangrijk om even door te bijten bij het leren van Haskell. De taal is in feite verschrikkelijk als je uit een volledig imperatieve achtergrond komt. Haskell zal echter zeer zeker je analytische vermogens verbeteren en het zal ook zeker helpen bij het leren of formaliseren van andere talen. Je krijgt meer inzicht in typering, data-structuren en generiek programmeren.