[Haskell-cafe] Currying: The Rationale

Chad Scherrer chad.scherrer at gmail.com
Wed May 23 12:20:04 EDT 2007


Is (^2) really considered currying? As I understand it, this is
syntactic sugar for a "section", and might confuse the issue a bit,
since it's distinct from ((^) 2). In this case we would have something
like

Prelude> let pow2 = ((^) 2)
Prelude> map pow2 [1..10]
[2,4,8,16,32,64,128,256,512,1024]

I think it's also worth pointing out that currying can make point-free
programming more natural. So, foldl has type

Prelude> :t foldl
foldl :: (a -> b -> a) -> a -> [b] -> a

That this could have been defined as
foldlUncurried :: ((a -> b -> a), a, [b]) -> a

but then simple point-free definitions like
sum = foldl (+) 0

would have to be written as
sum xs = foldlUncurried ((+), 0, xs)

OTOH, sometimes an uncurried version is easier to reason about. So, in
some of Richard Bird's work ("Algebra of Programming" is like this,
and probably at least some of his intro book) examples are uncurried,
as it shows more of the algebraic structure, and allows reasoning in a
product space rather than an exponential. Umm, I guess that qualifies
as jargon - sorry.

Chad

> (^) applied to 2, produces a new function, we can map over a list:
>
>    Prelude> let sq = (^2)
>    Prelude> map sq [1..10]
>    [1,4,9,16,25,36,49,64,81,100]
>
> or more explicitly:
>
>    Prelude> let x `to` y = x ^ y
>    Prelude> let sq x = x `to` 2
>    Prelude> map sq [1..10]
>    [1,4,9,16,25,36,49,64,81,100]
>
> -- Don


More information about the Haskell-Cafe mailing list