# [Haskell-beginners] Confusion over currying, , lambda, and closures

Francesco Ariis fa-ml at ariis.it
Thu Dec 24 04:37:22 UTC 2020

```Il 23 dicembre 2020 alle 21:12 Lawrence Bottorff ha scritto:
> I have these three versions of addition
>
> addA x y = x + y
> addB x = \y -> x + y
> addC = \x -> \y -> x + y
>
> […]
>
> currying, which I don't fully follow.

Parameters on the left-hand side of a function definition can always be
expressed as a lambda, by «plucking» them from the rightmost one

addA x y = x + y
addA x = \y -> x + y
addA = \x -> \y -> x + y  -- those three are equal!

Intuitively you can say that first we are binding the patterns in the
function definition and then the one left in the lambda right-hand side
(if any). So:

addA x = \y -> x + y   3 5
\y -> 3 + y            5
3 + 5

I suspect what the book is trying to teach you is that you can partially
apply a function and pass it around merrily:

map (addA 3) [1, 2, 3]

So by writing `addA 3` we obtain:

addA :: Int -> Int -> Int
addA :: Int -> (Int -> Int)        -- can also be written like this
-- since `(->)` is associates to
-- the right