"All functions are curried in Haskell by default" that is, all functions in Haskell take only one argument. How does it do this? By currying.
Scala has currying built-in. To demonstrate, take this method that takes tow Ints and returns an Int:
def aMethodWith2Args(x: Int, y: Int): Int = x + y
Let's lift it:
val lifted: (Int, Int) => Int = aMethodWith2Args(_, _)
and curry it:
val curried: Int => Int => Int = lifted.curried
So, we too now have a function that only takes one argument. It just returns another function that also takes only one argument. That's currying.
Now we can partially apply it
val partial: Int => Int = curried(1)
println(partial(2)) // prints out '3'
Just like Haskell.
The math behind it can be found here. Using Haskell notation:
($) :: (a -> b) -> (a -> b)
// $ takes function, returns function, this is the same as ((a -> b), a) -> b, instead of passing all
// arguments at once, we can pass first argument to function, receive partially applied function,
// and pass second argument to it.
No comments:
Post a Comment