This is why 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.

   Prelude> :t \xs ys->sum $ zipWith (*) xs ys
   \xs ys->sum $ zipWith (*) xs ys :: (Num a) => [a] -> [a] -> a

   Prelude> :t \xs->sum . zipWith (*) xs
   \xs->sum . zipWith (*) xs :: (Num a) => [a] -> [a] -> a

   Prelude> :t (sum .) . zipWith (*)
   (sum .) . zipWith (*) :: (Num a) => [a] -> [a] -> a

   Prelude> :t (\g->sum . g) . zipWith (*)
   (\g->sum . g) . zipWith (*) :: (Num a) => [a] -> [a] -> a

(.) composes single-parameter functions, so in (f . g) x y,
g only gets the first parameter, x. but by adding further
levels of composition to f, we can let g consume more parameters.

claus

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

Reply via email to