*Writer*monad is readily available in Haskell. But what about Writer

**comonad**? Let us start with the basics. Comonad class is defined as:

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