作爲陰和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