В языке F# одна функция может быть параметром и результатом другой функции.
Рассмотрим функцию, которая принимает другую функцию в качестве параметра:
let sum x y = x + y
let subtract x y = x - y
let operation x y func = func x y
let result1 = operation 10 6 sum // 16
printfn $"result1 = {result1}" // result1 = 16
let result2 = operation 10 6 subtract // 4
printfn $"result2 = {result2}" // result2 = 4
Здесь функция operation принимает три параметра. Причем третий параметр представляет функцию, которая принимает два параметра.
Далее мы можем вызвать функцию operation, передав ей в качестве параметра определенную функцию:
let result1 = operation 10 6 sum
Рассмотрим случай, когда функция возвращает другую функцию:
let sum x y = x + y
let subtract x y = x - y
let multiply x y = x * y
let empty x y = 0
let operation n =
if n = 1 then sum
elif n = 2 then subtract
elif n = 3 then multiply
else empty
let selection = operation 1
let result1 = selection 10 7 // 17
printfn $"result1 = {result1}" // result1 = 17
Здесь функция operation принимает один параметр и в зависимости от его значения возвращает одну из функций: sum, subtract, multiply или empty.
При чем все возвращаемые функции должны иметь один и тот же тип.
Затем мы можем вызвать функцию operation и получить ее результат:
let selection = operation 1
Поскольку здесь функции operation передается число 1, то она возвратит функцию sum. Соответственно значение selection будет представлять функцию
sum.
Далее через selection мы фактически может обращаться к этой функции sum:
let result1 = selection 10 7 // 17
Но мы можем укоротить получение и вызов функции:
let result2 = operation 2 10 7 // 3
printfn $"result2 = {result2}" // result2 = 3
Здесь operation 2 опять же представляет получение из operation функции (в данном случае функции subtract). И дальше передаются значения 10 7 для параметров
функции-результата.