Цепочки и композиции функций

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

Нередко одна функция должна принимать результат другой функции. В этом случае мы можем передавать одной функции результат другой функции. Например:

let add x = x + 10
let subtract x = x - 5
let multiply x = x * 2

let n = 10
let addResult = add n;
let subResult = subtract addResult
let mulResult = multiply subResult

printfn $"result = {mulResult}"        // result = 30

Здесь функция add принимает число и прибавляет к нему 10. Функция substract получает результат функции add и отнимает от него 5. Функция multiply получает результат функции subtract и умножает его на 2.

Конечно, мы можем сократить предыдущий пример, без применения лишних переменных:

let add x = x + 10
let subtract x = x - 5
let multiply x = x * 2

let n = 10
let mulResult = multiply (subtract (add n))

printfn $"result = {mulResult}"        // result = 30

Тем не менее при таком применении мы вынуждены использовать скобки. И если таких функций много, то избыточные скобки затруднят чтение программы.

Чтобы упростить построение цепочки функций в F# применяется pipe-оператор - оператор |>, который образует конвейер функций. Он имеет следующую форму:

input |> function

Слева от оператора идут входные данные для параметров функции, а справа сама функция. Результатом является результат функции, который в качестве параметра можно передать другой функции:

input |> function1 |> function2 |> function3 |> functionN

Например, перепишем предыдущий пример с помощью pipe-оператора:

let add x : int = x + 10
let subtract x = x - 5
let multiply x = x * 2

let n = 10
let result = n |> add |> subtract |> multiply

printfn $"result = {result}"        // result = 30

Если требуется передать несколько значений, то их можно объединить в один комплексный тип наподобие кортежа или структуры, которые будут рассмотрены далее

Композиция функций

Чтобы определить композицию различных функций, которые будут вызываться как единое целое, применяется оператор композиции функций - оператор >>. Например:

let add x = x + 10
let subtract x = x - 5
let multiply x = x * 2

let n = 10
let operation = add >> subtract >> multiply
let result = operation n
printfn $"result = {result}"        // result = 30

Здесь operation представляет композицию функций, где первой вызывается функция add, затем функция subtract и в конце функция multiply. Результат предыдущей функции передается в качестве параметра в последующую функцию. Параметр этой комплексной функции передается в ее первую функцию. Результатом комплексной функции является результат ее последней функции.

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