[Haskell-cafe] Are all arrows functors?

David Menendez dave at zednenem.com
Thu Nov 5 16:55:19 EST 2009


On Thu, Nov 5, 2009 at 4:34 PM, Andrew Coppin
<andrewcoppin at 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 <dave at zednenem.com>
<http://www.eyrie.org/~zednenem/>


More information about the Haskell-Cafe mailing list