Terwijl we berekeningen uitvoeren, willen we vaak een extra waarde bijhouden als resultaat. Dit kan bijvoorbeeld, zoals in “Evaluatiestappen bijhouden”, het aantal evaluatiestappen zijn, of een rapport (“log”) van wat we allemaal gedaan hebben.
type Log = [String]
complexComputation :: ... -> (a, Log)
type Steps = Int
complexComputation' :: ... -> (a, Steps)
type TimedLog = [(UTCTime, String)]
complexComputation'' :: ... -> (a, TimedLog)
Om dit gebruik te ondersteunen, bestaat het Writer type:
newtype Writer w a = Writer { runWriter :: (a, w) }
Als w
een Monoid is (met een neutraal element mempty :: w
en een
associatieve operatie mappend :: w -> w -> w
), kunnen we Writer een instantie
van Monad maken. Definieer deze instantie en vul enkele functies aan die gebruik
maken van Writer.