Julien Oster wrote:
> While we're at it: The best thing I could come up for
> 
> func2 f g l = filter f (map g l)
> 
> is
> 
> func2p f g = (filter f) . (map g)
> 
> Which isn't exactly point-_free_. Is it possible to reduce that further?

Sure it is:

func2 f g l = filter f (map g l)
func2 f g = (filter f) . (map g)        -- definition of (.)
func2 f g = ((.) (filter f)) (map g)    -- desugaring
func2 f = ((.) (filter f)) . map        -- definition of (.)
func2 f = flip (.) map ((.) (filter f)) -- desugaring, def. of flip
func2 = flip (.) map . (.) . filter     -- def. of (.), twice
func2 = (. map) . (.) . filter          -- add back some sugar


The general process is called "lambda elimination" and can be done
mechanically.  Ask Goole for "Unlambda", the not-quite-serious
programming language; since it's missing the lambda, its manual explains
lambda elimination in some detail.  I think, all that's needed is flip,
(.) and liftM2.


Udo.
-- 
I'm not prejudiced, I hate everyone equally.

Attachment: signature.asc
Description: Digital signature

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

Reply via email to