Функция как параметр и результат другой функции

Последнее обновление: 10.12.2023

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

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850