2009-12-14 91 views
27

我在一些代碼注意到,在這個sample包含>>操作:在F#中,>>操作符是什麼意思?

let printTree = 
    tree >> Seq.iter (Seq.fold (+) "" >> printfn "%s") 

是什麼>>操作平均/怎麼辦?

非常感謝,現在它更清晰。 這裏是我的例子中,我產生得到了它的竅門:

open System 
open System.IO 

let read_lines path = File.ReadAllLines(path) |> Array.to_list 

let trim line = (string line).Trim() 
let to_upper line = (string line).ToUpper() 

let new_list = [ for line in read_lines "myText.txt" -> line |> (trim >> to_upper) ] 

printf "%A" new_list 
+0

你甚至可以現在更簡潔:... let new_list2 = read_lines「myText.txt」|> List.map(trim >> to_upper)...這是我自己寫數據處理的形式。 – cfern 2009-12-15 08:02:25

+0

真棒,所以我可以把它變成:let new_list2 = File.ReadAllLines(path)|> Array.map(trim >> to_upper)...非常整齊:)謝謝 – Russell 2009-12-15 11:16:05

+0

看,你正在學習:) – cfern 2009-12-15 12:50:46

回答

55

這是函數組合操作符。

有關Chris Smith's blogpost的更多信息。

在介紹該函數組合 操作符(>>):

let inline (>>) f g x = g(f x)

其內容:給定兩個函數中,f 和g,且值x計算的結果 f的x並將結果 傳遞給g。這裏有趣的是 ,你可以咖喱(>>)功能 ,只通過參數f和g, 結果是一個函數,它需要一個參數 併產生 結果g(f(x)) 。

這裏的撰寫 功能進行規模較小的的一個簡單的例子:

let negate x = x * -1 
let square x = x * x 
let print x = printfn "The number is: %d" x 
let square_negate_then_print = square >> negate >> print 
asserdo square_negate_then_print 2 

當執行打印「-4」。

12

>>操作者構成兩個功能,所以x |> (g >> f) = x |> g |> f = f (g x)。另外還有另一個運營商<<,它們構成另一個方向,所以(f << g) x = f (g x),在某些情況下可能更自然。

1

構圖運算符<<>>用於連接兩個函數,使得一個的結果成爲另一個的輸入。由於功能也是值,除非另有說明,它們被視爲這樣使得以下表達式是等效的:

f1 f2 f3 ... fn x = (..((f1 f2) f3) ... fn) x

具體地說,f2, f3, ...fnx被視爲值和作爲被傳遞之前,不評估參數到它們的前面的功能。有時候這就是你想要的,但其他時候你想表明一個函數的result是另一個函數的輸入。這可以通過使用複合算<<>>從而實現:

(f1 << f2 << f3 ... << fn) x = f1(f2(f3 ... (fn x)..)

同樣

(fn >> ... f3 >> f2 >> f1) x = f1(f2(f3 ... (fn x)..)

由於該組合物操作者返回一個函數,顯式參數,x,不像不需要在管道運營商x |> fn ... |> f1f1 <| ... fn <| x