Dan Burton
Dan Burton

Reputation: 53665

What is the Comonad typeclass in Haskell?

What is the Comonad typeclass in Haskell? As in Comonad from Control.Comonad in the comonad package (explanations of any other packages that provide a Comonad typeclass are also welcome). I've vaguely heard about Comonad, but all I really know about it is that is provides extract :: w a -> a, sort of a parallel to Monad's return :: a -> m a.

Bonus points for noting "real life" uses of Comonad in "real" code.

Upvotes: 112

Views: 19879

Answers (2)

Dan Burton
Dan Burton

Reputation: 53665

This doesn't fully answer my question, but I wanted to put some relevant information in answer format:

"co" (loosely) means "flip the arrows". Here's a rough visual of that.

Consider the monadic operations:

return :: a ~> m a
flip (>>=) :: (a ~> m b) -> (m a ~> m b)

Reverse the squiggly arrows and you get the comonadic operations:

extract :: a <~ w a
extend :: (a <~ w b) -> (w a <~ w b)

(Written with normal arrows)

extract :: w a -> a
extend :: (w a -> b) -> w a -> w b

Notice how in this format, return is an arrow that just so happens to fit in the argument slot for flip (>>=), and the same is true of extract and extend. Monad/comonad laws say that when you put return or extract into that slot, the result is the identity arrow. The laws are the same, "just with the arrows flipped". That's a super handwavey answer but hopefully it provides some insight.

Upvotes: 27

Alexey Romanov
Alexey Romanov

Reputation: 170713

These links may be helpful:

  1. Evaluating cellular automata is comonadic. In particular, "whenever you see large datastructures pieced together from lots of small but similar computations there's a good chance that we're dealing with a comonad".
  2. Sequences, streams, and segments
  3. Comonads in everyday life

Upvotes: 85

Related Questions