Function composition and currying

Dr Mark H Phillips mark@austrics.com.au
17 Jul 2003 09:57:16 +0930


Hi,

Hopefully this is a simple question.  I am wanting to know good ways
of using ".", the function composition operator, when dealing with
currying functions.

Suppose I have the following functions defined:

  f :: Int -> Int
  f x = x*x

  g :: Int -> Int -> Int
  g a b = a + b

If I wish to add 1 and 2 together and then square them I can do:

  f (g 1 2) = 9

but what if I wish to use function composition in the process?

I can't do 

  (f.g) 1 2

because the 2 doesn't get passed in till too late.

I could do

  (f.(g 1)) 2

or even

  (f.(uncurry g)) (1,2)

But what I really want is a function with signature Int -> Int -> Int.
The answer is probably:

  (curry (f.(uncurry g))) 1 2

but this seems awfully messy just to do f (g 1 2).

And what if g were a function with three curried arguments?  Then
uncurry and curry wouldn't apply.  What then?

Is there a better way?

Thanks,

Mark.


-- 
Dr Mark H Phillips
Research Analyst (Mathematician)

AUSTRICS - smarter scheduling solutions - www.austrics.com

Level 2, 50 Pirie Street, Adelaide SA 5000, Australia
Phone +61 8 8226 9850
Fax   +61 8 8231 4821
Email mark@austrics.com.au