Argument Selection Function
The argument selection function λfirst.λsecond.first
accepts a function as an argument and returns a function which, when given an argument, returns the first argument.
// λfirst.λsecond.first
const selectFirst = x => y => x
const double = a => a * 2
const triple = a => a * 3
const applyDouble = selectFirst(double)
const applyTriple = applyDouble(triple)
applyTriple(3) // equals 6
Here's the same example with the second argument selected:
// λfirst.λsecond.second
const selectSecond = x => y => y
const double = a => a * 2
const triple = a => a * 3
const applyDouble = selectSecond(double)
const applyTriple = applyDouble(triple)
applyTriple(3) // equals 9
Argument selection can be built upon for further composition, allowing us to pair arguments in different ways such as the following pair function λfirst.λsecond.λfunc.((func first) second)
, which applies the first argument to a provided function, and then the second argument to the result of that.
// λfirst.λsecond.λfunc.((func first) second)
const makePair = first => second => func => func(first)(second)
const double = a => a * 2
const triple = a => a * 3
const multiply = a => b => a * b
makePair(double(2))(triple(2))(multiply) // equals 24
The same in F# which is slighltly more concise:
// λfirst.λsecond.λfunc.((func first) second)
let makePair first second func = func first second
let double a = a * 2
let triple a = a * 3
let multiply a b = a * b
makePair (double 2) (triple 2) multiply // equals 24
Finally, some languages like F# have a function composition operator which make functions like the makePair
one above brief and elegant.
let double a = a * 2
let triple a = a * 3
let multiply a b = a * b
let makePair = double >> triple >> multiply
makePair 2 2 // equals 24