On Tue, Apr 19, 2011 at 11:29 AM, Henning Thielemann
<lemming@henning-thielemann.de> wrote:
Is it common to make a type an instance of both Arrow and Functor type class? If a type is both instance of Arrow and Functor, would you expect that fmap = (^<<) ? If yes, how about adding this as expected law to the Control.Arrow documentation?
For any instance of Functor that is also an Arrow this must hold already given existing laws.
One (particularly obvious) arrow law is that
arr id = id
This law states the fact that arr is the Functor from the category of Haskell types to your arrow category.
Given that:
id ^<< g = arr id <<< g = g . arr id = g . id = g = id g
we can see (^<<) id = id is satisfied. The "second Functor law" comes for free given (^<<) id = id, and the free theorem for (^<<), so (^<<) is admissable as a definition for fmap.
Finally, valid Functor instances for a given type are unique.
This also follows from the free theorem for fmap and the side condition that fmap id = id and has been worked through here on the cafe before. I believe it was done most recently by Russell O'Connor.
So fmap = (^<<) must hold for any type that is both a valid instance of Arrow and Functor.
The free theorem for fmap does all your work for you and no new laws need to be placed on the books.
-Edward
Same question for Applicative functors and liftA2 (,) = (&&&). (Btw. Control.Arrow haddock documentation does not mention any Arrow law so far.)
_______________________________________________
Libraries mailing list
Libraries@haskell.org
http://www.haskell.org/mailman/listinfo/libraries