Totally get lost of the following example that returning a function
getAddFunc :: Int -> (Int -> Int)
getAddFunc x y = x y
adds3 = getAddFunc 3
fourPlus3 = adds3 4
the function signature Int -> (Int -> Int) told me it accept an Int and function that typed Int -> Int And I am very confused about the function definition x y = x y, it looks like it took 2 integers x and y rather than just 1 integer! What's the meaning of x and y here? I am very confused.
Can someone help me with this?
CodePudding user response:
You are looking at a curried function. The code
getAddFunc x y = x y
is equivalent to
getAddFunc x = \y -> x y
i.e., taking x as argument and returning a function of y.
This can also be written
getAddFunc = \x -> \y -> x y
or
getAddFunc = \x y -> x y
In Haskell, from a technical point of view, every function takes exactly one argument. However, after taking that argument, it can return another function taking as input a "second" argument. This mechanism can also be interpreted as a function taking "two" arguments. This further generalizes to N arguments in a similar way.
CodePudding user response:
All functions in Haskell take one parameter. Indeed, the function:
getAddFunc x y = x y
is equivalent to:
getAddFunc x = \y -> x y
and to:
getAddFunc = \x -> \y -> x y
You thus construct a function that takes a parameter x, and it maps it to a function that takes a parameter y and will return x y.
This thus means that getAddFunc 42 is a function that takes a parameter and will add 42 to it.
The (->) type constructor is right associative. Indeed, Int -> (Int -> Int) is the same as Int -> Int -> Int.
