On Thu, Nov 5, 2009 at 4:34 PM, Andrew Coppin <andrewcop...@btinternet.com> wrote: > Nicolas Pouillard wrote: >> >> Excerpts from Neil Brown's message of Tue Nov 03 13:45:42 +0100 2009: >> >>> >>> Hi, >>> >>> I was thinking about some of my code today, and I realised that where I >>> have an arrow in my code, A b c, the type (A b) is also a functor. The >>> definition is (see >>> http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Arrow.html): >>> >>> fmap = (^<<) >>> -- Or, in long form: >>> fmap f x = arr f <<< x >>> >>> Out of curiosity, and since this is a typical haskell-cafe question, does >>> this definition of fmap hold for all arrows? >>> >> >> Yes, as shown by the 'WrappedArrow' newtype: >> >> >> http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Applicative.html#t%3AWrappedMonad >> > > While I don't wish to suggest that "all arrows are functors" is false, I > think the argument "yes, because this library says so" is not too strong. > Let us not forget, according to *the libraries*, Double is in Enum - which, > I think you'll agree, is just weird...
It's fairly simple to prove the functor laws using the arrow laws. Among the nine laws for arrows are a >>> arr id = a a >>> arr f >>> arr g = a >>> arr (g . f) Using the definition fmap f a = a >>> arr f, it's pretty simple to prove the functor laws: fmap id = id fmap f . fmap g = fmap (f . g) -- Dave Menendez <d...@zednenem.com> <http://www.eyrie.org/~zednenem/> _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe