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 :: wa -> a , sort of a parallel to Monad's return :: a -> ma .

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


These links may be helpful:

  • 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".
  • Sequences, streams, and segments
  • Comonads in everyday life

  • 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.

    链接地址: http://www.djcxy.com/p/43468.html

    上一篇: Haskell:Typeclass暗示其他类型

    下一篇: Haskell中的Comonad类型类是什么?