<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
  </head>
  <body text="#000000" bgcolor="#ffffff">
    Why are Cofunctor and Comonad classes not a part of the base
    library?<br>
    <br>
    I recently defined a data type (Control.Cofunctor.Ticker in
    monad-coroutine on Hackage) that happens to be a co-functor, or
    contra-functor if you prefer. In other words, it can implement the
    following function:<br>
    <br>
    &gt; cofmap :: (a -&gt; b) -&gt; cf b -&gt; cf a<br>
    <br>
    I wanted to define a proper instance for it, but to my surprise I
    discovered that I couldn't. Not only is the class not defined in
    base, the only package I could find on Hackage that defines it is
    category-extras. This is a huge package I'd rather not have as a
    dependency, so I opted not to declare any instance.<br>
    <br>
    Later on I found that this question has been raised before by <b>Conal
      Elliott</b>, nearly four years ago.<br>
    <br>
    <a class="moz-txt-link-freetext" href="http://www.haskell.org/pipermail/libraries/2007-January/006740.html">http://www.haskell.org/pipermail/libraries/2007-January/006740.html</a><br>
    <br>
    The result was the TypeCompose package, which presents a decent
    solution. I still can't think of any harm in having a proper class
    declaration in the base library: if you don't need it, you don't
    need to know it. But without the class declaration in the base
    library (or in some other obvious package) every other released
    library must either lack the instance declarations or declare the
    class itself and risk clashes.<br>
    <br>
    This is not some obscure class you've never encountered, by the way:
    any "consumer" of data is a cofunctor. All regexp data types, for
    example, are cofunctor instances - or would be if there was a class
    to declare them instances of.<br>
    <br>
    The same question extends to Comonad. I am not too familiar with
    this area so there may be fewer potential instances of the class,
    but I remember there was quite a bit of buzz around comonads a few
    years ago. Judging by a cursory Hayoo search, if anything the
    situation is worse than with Cofunctor: there are multiple
    incompatible declarations of the class scattered in various
    libraries that need it: ad, category-extras, data-category, rope.
    There is also evidence of undeclared Comonad instances: see the
    ListZipper and value-supply libraries.<br>
    <br>
    So, is it time to add these two classes to the base library?<br>
    <br>
  </body>
</html>