[Haskell-cafe] Re: Very crazy

Jonathan Cast jcast at ou.edu
Tue Sep 25 11:45:36 EDT 2007


On Tue, 2007-09-25 at 12:24 +0100, Andrew Coppin wrote:
> Chaddaï Fouché wrote:
> > 2007/9/25, Andrew Coppin <andrewcoppin at btinternet.com>:
> >   
> >> 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
> >>
> >>     
> >
> > (sum . zipWith (*)) xs ys
> > == (sum (zipWith (*) xs)) ys
> >
> > so you try to apply sum :: [a] -> Int to a function (zipWith (*) xs)
> > :: [a] -> [b], it can't work !
> >
> > (sum.) . zipWith (*)
> > works, but isn't the most pretty expression I have seen.
> >   
> 
> I'm still puzzled as to why this breaks with my example, but works 
> perfectly with other people's examples...
> 
> So you're saying that
> 
>   (f3 . f2 . f1) x y z ==> f3 (f2 (f1 x) y) z
> 
> ? In that case, that would mean that
> 
>   (map . map) f xss ==> map (map f) xss
> 
> which *just happens* to be what we want. But in the general case where 
> you want
> 
>   f3 (f2 (f1 x y z))
> 
> there's nothing you can do except leave point-free.

In effect, yes.  As many others have pointed out, you *can* do this
point-free (all of lambda calculus can be re-written using the functions

s f g x = f x (g x)
k x y = x
 
(1)), but it's not a good idea.  Good style in Haskell as in any other
language is a matter of taste, not rules.

jcc

(1) http://www.madore.org/~david/programs/unlambda/



More information about the Haskell-Cafe mailing list