
Andrew Coppin writes:
...I found it so surprising - and annoying - that you can't use a 2-argument function in a point-free expression. For example, "zipWith (*)" expects two arguments, and yet
sum . zipWith (*) fails to type-check. You just instead write
\xs ys -> sum $ zipWith(*) xs ys
which works as expected.
I can't figure out why map . map works, but sum . zipWith (*) doesn't work. As I say, the only reason I can see is that the type checker hates me and wants to force me to write everything the long way round...
I suspect that it is you who hates the Haskell type-checker, forcing it to work on expressions which go against the rules: precedence, and normal order. The transformation to combinators is doable, but one has to be careful. Let's see: res p q = sum (zipWith (*) p q) = (sum . (zipWith (*) p)) q res p = (sum .) (zipWith (*) p) = ((sum .) . (zipWith (*)) p res = (sum .) . (zipWith (*)) Certainly it is a kind of madness, since is hardly readable, but it is correct. Jerzy Karczmarczuk