我聲明一個管道是如何處理的?我知道三種方式:我應該如何申報管道?
let hello name = "Hello " + name + "!"
let solution1 = hello <| "Homer"
let solution2 = "Homer" |> hello
你會選擇哪一種? solution1或solution2 - 爲什麼?
我聲明一個管道是如何處理的?我知道三種方式:我應該如何申報管道?
let hello name = "Hello " + name + "!"
let solution1 = hello <| "Homer"
let solution2 = "Homer" |> hello
你會選擇哪一種? solution1或solution2 - 爲什麼?
如前所述,管道轉發運算符|>
有助於功能組合和類型推斷。它允許您重新排列函數的參數,以便您可以先放置函數的最後一個參數。這使得鏈接的功能非常可讀(類似於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)
,而且'let solution5 = createPerson 1 |> hello'可以用嗎? – ebb 2011-03-13 15:29:03
@ebb:一個更好的例子是'1 |> createPerson |> hello' - 你的例子也可以工作,但僅僅是因爲'1'是一個常量 – BrokenGlass 2011-03-13 15:39:06
你是否介紹了一個不使用常量的例子? – ebb 2011-03-13 15:45:03