module Writer where type Writer a = (a, String -> String) unitW :: a -> Writer a unitW a = (a, \ s -> s) bindW :: Writer a -> (a -> Writer b) -> Writer b m `bindW` k = let (a, f1) = m; (b, f2) = k a in (b, \ s -> f1 (f2 s)) writeW :: String -> Writer () writeW s = ((), (s++))