Как указали Инь и codekaizen, вы не можете объединить две функции, чтобы создать функцию, которая передает входные данные первой, а затем передает выходные данные этого вызова второй функции (то есть, используя оператор th >>
).).Используя диаграмму, вы не можете сделать:
+---------+ +---------+
--->| AddNums |--->| MulNums |--->
+---------+ +---------+
Один из вариантов - изменить функцию и указать один из параметров, чтобы можно было составлять функции.Пример codekaizen использует это и может также быть написан так (если вы используете каррирование вместо параметров с кортежем):
let AddNums x y = x + y
let MulNums x y = x * y
let FuncComp = (AddNums 1) >> (MulNums 2)
Другой вариант для составления функций - создать функцию, которая принимает несколько входных данных, передаетдва числа для первой функции, а затем вызывает вторую функцию с результатом и другим числом из исходных входов.Используя диаграмму:
-----------------\
--->+---------+ \+---------+
--->| AddNums |--->| MulNums |--->
+---------+ +---------+
Если вам нужно что-то подобное, тогда лучшим вариантом будет написать это напрямую, потому что это, вероятно, не будет часто повторяющимся шаблоном.Непосредственно, это легко (с использованием варианта с карри):
let AddNums x y = x + y
let MulNums x y = x * y
let FuncComp x y z = AddNums z y |> (MulNums z)
Если вы хотите написать что-то подобное в более общем плане (или просто для любопытства), вы можете написать что-то вроде этого (используя кортежную версиюфункции на этот раз).Оператор &&&
вдохновлен Стрелками :
let AddNums (x,y) = x + y
let MulNums (x,y) = x * y
let (&&&) f g (a, b) = (f a, g b)
let FuncComp = (AddNums &&& id) >> MulNums
// First two numbers are added, result is multiplied by the third one
FuncComp ((9, 12), 2) // Gives '42'