On 16 Feb 2008, at 11:40 PM, Peter Verswyvelen wrote:

After having played with some packages that use arrows, and after having read the very nice "programming with arrows" paper I wanted to build some of my own.

Strangely my code did not work, even the simplest function got stuck in an infinite loop or gave a stack overflow.

I quickly noticed I made a really stupid mistake, I forget to implement "arr"! However, the compiler did not give a warning on this. So I wandered how it was possible that the Arrow package had a default implementation for something so specific as arr?

The code revealed the following:

        -- | Lift a function to an arrow: you must define either this
        --   or 'pure'.
        arr :: (b -> c) -> a b c
        arr = pure

        -- | A synonym for 'arr': you must define one or other of them.
        pure :: (b -> c) -> a b c
        pure = arr
Ah, so the default implementation of arr is pure... and vice versa...

This feels like rather incorrect to me, but my feelings are based on imperative background knowledge, so this might be totally correct design in Haskell.

Why not force people to implement arr and leave just pure as the synonym? And if pure is really a synonym for arr, what does it do inside the Arrow type class? Does it ever make sense to have a different implementation for arr and pure?

No; the equations arr = pure and pure = arr are laws for the class. (This is true in general for default methods).

Note that this situation --- where leaving the default methods in place gives rise to an infinite loop --- is quite common; it occurs for the classes Eq and Ord, as well, for example. This example is admittedly kind of silly, but I'm sure someone has a passionate attachment to one or both names, so requiring definitions to use one or the other would be controversial.

jcc

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to