2011-03-13 74 views
4

我聲明一個管道是如何處理的?我知道三種方式:我應該如何申報管道?

let hello name = "Hello " + name + "!"  
let solution1 = hello <| "Homer" 
let solution2 = "Homer" |> hello 

你會選擇哪一種? solution1或solution2 - 爲什麼?

回答

7

如前所述,管道轉發運算符|>有助於功能組合和類型推斷。它允許您重新排列函數的參數,以便您可以先放置函數的最後一個參數。這使得鏈接的功能非常可讀(類似於C#中的LINQ)。你的例子並沒有顯示這個功能 - 當你爲連續的幾個函數建立了一個變換「管道」時,它真的會發光。

使用|>鏈接你可以寫:

let createPerson n = 
    if n = 1 then "Homer" else "Someone else" 

let hello name = "Hello " + name + "!" 

let solution2 = 
    1 
    |> createPerson 
    |> hello 
    |> printf "%s" 

管向後操作<|的好處是,它改變了運算符優先級,因此它可以爲你節省很多括號:函數的參數,通常先計算左正確的,使用<|如果你想將一個函數的結果傳遞給另一個函數,你不需要括號 - 你的例子並沒有真正利用這一點。

這些是等價的:

let createPerson n = 
    if n = 1 then "Homer" else "Someone else" 

let hello name = "Hello " + name + "!" 

let solution3 = hello <| createPerson 1 
let solution4 = hello (createPerson 1) 
+0

,而且'let solution5 = createPerson 1 |> hello'可以用嗎? – ebb 2011-03-13 15:29:03

+0

@ebb:一個更好的例子是'1 |> createPerson |> hello' - 你的例子也可以工作,但僅僅是因爲'1'是一個常量 – BrokenGlass 2011-03-13 15:39:06

+0

你是否介紹了一個不使用常量的例子? – ebb 2011-03-13 15:45:03

3

F#從上到下,從左到右讀取。出於這個原因,|>運營商使用遠遠多於<|,因爲它有助於進行類型推斷。

+0

@J庫珀 - 是否有任何情況下'<|'會是有用的? – ebb 2011-03-13 15:12:13

+0

有時你可以使用它來避免括號,我想,就像'如果不是<| f x y then ...' – 2011-03-13 16:07:41

+3

我更喜歡用'raise <|例外()'而不是'(引發異常())'或向後尋找'Exception()|> raise' – petebu 2011-03-13 19:41:47