In 1992 schreef Philip Wadler het artikel De essentie van functioneel programmeren1. In dit artikel beschrijft hij hoe concepten van categorietheorie toegepast kunnen worden in functionele programmeertalen. Een korte samenvatting van de introductie geven we hieronder.
Zoals we in de les gezien hebben bestaat een monad uit twee operaties gedefinieerd over een typeconstructor. We kunnen deze implementeren als een typeclass maar dat is niet essentieel. In de paper van Philip Wadler is een monad gedefinieerd als een tripel (M,unitM,bindM)
, waarbij M
de typeconstructor is en unitM
en bindM
polymorfe functies zijn met de volgende types:
unitM :: a -> M a
bindM :: M a -> (a -> M b) -> M b
Als we een programma naar monadische stijl omvormen dan moeten we elk functietype van \(a \rightarrow b\) omzetten naar een functie \(a \rightarrow M~b\). Hieronder staat een monadische variant van de interpreter die we tijdens het hoorcollege gezien hebben. De functie interp
heeft nu niet het type \(Term \rightarrow Environment \rightarrow Value\) maar het type \(Term \rightarrow Environment \rightarrow M~Value\). Een constante evalueren in de monadische interpreter is nu als volgt gedefinieerd:
interp (Con i) e = unitM (Num i)
Het grote voordeel van een interpreter op monadische wijze te implementeren is dat we hem makkelijk kunnen aanpassen om extra functionaliteit te ondersteunen - je kan al raden wat we in de volgende oefeningen zullen doen.
id x = x
.