λx.x x is the self application function. It applies its argument to its argument.
// λx.x x const sa = x => x(x)
Like the identity function, it doesn't seem helpful at first glance but it has some interesting applications. Consider the twice function
λf.λx.f (f x), which applies function
f to the value
x and then applies function
f again to the result of that.
// λf.λx.f (f x) const twice = f => x => f(f(x)) const addOne = a => a + 1 twice(addOne)(1) // 3
By supplying the
twice function with the
addOne function, and then supplying the resulting function with
1, we get
3. That's because
twice(addOne)(1) is the same as
1 + 1 + 1.
Going back to the self application function, since it applies its argument to its argument, given the function
twice, it will apply
twice, applying the
addOne function four times.
// λx.x x const sa = x => x(x) // λf.λx.f (f x) const twice = f => x => f(f(x)) // (λx.x x) (λf.λx.f (f x)) const fourTimes = sa(twice) const addOne = a => a + 1 fourTimes(addOne)(1) // 5