[Haskell-cafe] Curiose types
Andrew Coppin
andrewcoppin at btinternet.com
Sun May 27 06:12:47 EDT 2007
As I lay in bed last night, a curios fact occurred to me. (Yes, I don't
get out very much...)
Consider the map function:
map :: (a -> b) -> [a] -> [b]
There are two ways you can think about this function. First, you can see
it as meaning
map :: (a -> b) -> ([a] -> [b])
Which is beautifully symmetric. Alternatively, you can think about how
you actually use it:
map :: ((a -> b) -> [a]) -> [b]
Now this got me thinking: is (->) associative? x_x
Well now, let's consider a general 3-argument function:
foo :: a -> b -> c -> d
According to the rules, this is of course equivilent to
foo :: a -> (b -> (c -> d))
If you understand what currying is and how it works, this makes perfect
sense. Now let's bracket that the other way:
foo :: ((a -> b) -> c) -> d
Well, while that type *does* make sense, it's clearly a completely
*different* type!
So, clearly, (->) is not associative. Now I'm left wondering why you can
bracket the type for map in two different ways, but not in general. Hmm...
More information about the Haskell-Cafe
mailing list