
The final piece is that (->) is an Arrow, the most basic one but still an Arrow, so if you replace a by (->) in the type of second, you get : second :: (->) b c -> (->) (d, b) (d, c) which is just second :: (b -> c) -> (d, b) -> (d, c)
Ahh I see, very clever! There is method to the madness after all; I should never have doubted you Haskell. Thank you for taking the time to explain that :) Do you know of any good discussions/tutorials on Arrows? I've only managed to find little snippets here and there http://www.haskell.org/arrows/ Doesn't have a lot of detail and http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Arrow.htm... ..would probably be useful once I actually understand what is going on but right now I think a slap in the face with a big wet fish might help me more ;) - Philip