Are all arrows functors?

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.htm...): 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? And is there a wiki page somewhere that has a table of all of these Haskell type-classes (Functor, Monad, Category, Arrow, Applicative and so on), and says that if you are an instance of class A you must have some corresponding instance of B? (e.g. all Monads are Functors and Applicatives) I'm fairly certain my arrow isn't a Monad or Applicative, although of course it must be a Category, given the type-class dependency, but it would be nice when using one of these things to see what other instances you should automatically supply. Thanks, Neil.

2009/11/3 Neil Brown
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.htm...):
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?
And is there a wiki page somewhere that has a table of all of these Haskell type-classes (Functor, Monad, Category, Arrow, Applicative and so on), and says that if you are an instance of class A you must have some corresponding instance of B? (e.g. all Monads are Functors and Applicatives) I'm fairly certain my arrow isn't a Monad or Applicative, although of course it must be a Category, given the type-class dependency, but it would be nice when using one of these things to see what other instances you should automatically supply.
What about the Typeclassopedia (http://haskell.org/sitewiki/images/8/85/TMR-Issue13.pdf)?
Thanks,
Neil. _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
-- Eugene Kirpichov Web IR developer, market.yandex.ru

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.htm...):
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-Applicati... -- Nicolas Pouillard http://nicolaspouillard.fr

See also the paper "Idioms are oblivious, arrows are meticulous, monads are promiscuous" [1]. Functors can be extended to give applicative functors (idioms) which can then be extended to arrows, and then monads. So all arrows are also (applicative) functors. [1]: http://homepages.inf.ed.ac.uk/wadler/papers/arrows-and-idioms/arrows-and-idi...

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.htm...):
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-Applicati...
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...

On Thu, Nov 5, 2009 at 4:34 PM, Andrew Coppin
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.htm...):
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-Applicati...
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
participants (6)
-
Andrew Coppin
-
David Menendez
-
Eugene Kirpichov
-
George Pollard
-
Neil Brown
-
Nicolas Pouillard