В языке 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
для параметров
функции-результата.