Нередко одна функция должна принимать результат другой функции. В этом случае мы можем передавать одной функции результат другой функции. Например:
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. Результат предыдущей функции передается в качестве параметра в последующую функцию. Параметр этой комплексной функции передается в ее первую функцию. Результатом комплексной функции является результат ее последней функции.