Comonad w where extract :: w a -> a duplicate :: w a -> w (w a) extend :: (w a -> b) -> w a -> w b
The minimal implementation requires you to implement 'extract' and 'extend.' Additionally, it must satisfy the following comonad laws:
1 2 3 | extend extract = id extract . extend f = f extend f . extend g = extend (f . extend g) |
The 'extract' is pretty straightforward -- it allows safely extract value from the monad:
extract x = fst $ runWriter x
Our first intuition for 'extend' would be something like this:
extend f wa = return (f wa)
Which is incorrect, as it losses the state accumulated so far and replaces it with 'mempty' and thus do not satisfy the 1st law above (extend extract = id).
Without further ado, the writer comonad definition below correctly preserves the state and meets all three laws:
instance (Monoid w) => Comonad (Writer w) where extract x = fst $ runWriter x extend f wa = (tell $ execWriter wa) >> return (f wa)
Links:
No comments:
Post a Comment