作为阴和codekaizen指出,不能构成两个函数以创建将输入到第一个函数,并且然后这个调用的输出传递到第二个函数(即使用运算符>>
)。使用图表,你不能做:
+---------+ +---------+
--->| AddNums |--->| MulNums |--->
+---------+ +---------+
一个选项是改变功能,并指定其中的一个参数,这样的功能可以组成。通过codekaizen本例使用这一点,可也这样写的(如果你使用的讨好,而不是tupled参数):
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)
如果你想写类似的东西更普遍(或只是出于好奇),你可以写这样的事情(使用的功能,这个tupled版本时间)。该&&&
操作由Arrows启发:
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'
我不太看你使用'AddNum >> MulNums',点AddNums的输出为单数,因此不MulNums的有效输入格式,这意味着两个功能根本不复合。 – 2010-07-10 07:19:47