
On Wed, 2007-10-03 at 22:31 +1000, Stuart Cook wrote:
On 10/3/07, PR Stanley
wrote: Without looking at the standard prelude, define the higher-order library function curry that converts a function on pairs into a curried function, and conversely, the function uncurry that converts a curried function with two arguments into a function on pairs.
In other words, take a function like[1]
add a b = a + b
and make the following possible:
(uncurry add) (2, 3)
Conversely, take a function like
sub' (a, b) = a - b
and make the following possible:
(curry sub') 4 1
Hint: first write down the types of the two functions.
This, I think, is the key part, and it's a useful technique for Haskell in general.
First, write down the (general) type of a curried function, and the type of the corresponding uncurried function. Use those types to figure out what types curry and uncurry should have. Once you've done that, the implementation (which is pretty straightforward) should reveal itself.
Indeed, modulo bottom, the implementation of these functions is -completely- determined by the types. Djinn, for example, can automatically generate the implementations from the types.