還是真的我能避免與操作支架這樣的:我可以避免在Seq.iter中使用括號嗎?
X |> Seq.iter(fun x ->())
所以我想知道這是否有可能使一些技巧與管道相似與否。我已經嘗試了不同的方式,但知道我要回來就可以了,問也許我可以使用的東西不喜歡它| |
X |> Seq.iter <| fun x ->
還是真的我能避免與操作支架這樣的:我可以避免在Seq.iter中使用括號嗎?
X |> Seq.iter(fun x ->())
所以我想知道這是否有可能使一些技巧與管道相似與否。我已經嘗試了不同的方式,但知道我要回來就可以了,問也許我可以使用的東西不喜歡它| |
X |> Seq.iter <| fun x ->
當然,你可以寫:
for x in X do()
好吧,這不是你在問什麼,但是序列表達式和for
通常是用於表達流水線的語法上更簡單的方法。
回到你的問題 - 爲什麼<|
不起作用(對於更長的管道)是因爲它的優先級太低(因爲它首先有不同的目的)。您需要一些優先級高於|>
的操作員,以便正確解析代碼。比如,你可以寫:
let (+<) f a = f a
[1..10] |> Seq.map +< fun x -> x * x
|> Seq.iter +< fun x -> printfn "%A" x
但實際上,它是在實踐中沒有使用這個是一個好主意,因爲它不保存你任何打字,它會混淆其他F#程序員誰將會閱讀你的代碼(與使用$
時的Haskell不同)。
Tomas,你剛剛給了我一個想法,使用'^'建立一個右聯合反向管道,'let inline(^ <|)f a = f a'。創建了我的第一個snippit:http://fssnip.net/4o – 2011-04-26 20:39:29
@Stephen:剛剛注意到通過Twitter的片段:-)。好的和有用的樣本!感謝您發佈它。 – 2011-04-26 23:11:08
謝謝!我喜歡 – Cynede 2011-04-27 04:39:10
爲了進行類型推斷,您擁有的最有可能是最好的方式。它允許功能'a -> unit
知道'a
的類型,因爲seq<'a>
首先被給出(並且類型推斷從上到下/從左到右)。您可以通過幾種不同的方式重新排列表達式,但沒有一種可以節省擊鍵,並且可能會更加尷尬。
你爲什麼要這樣做? '<|'與()相同的字符數? – Daniel 2011-04-26 14:53:01
我猜 - >運算符的優先級有點太低... – LLS 2011-04-26 14:53:33
我只是使用一個命名函數。 'X |> Seq.iter f' – 2011-04-26 16:21:50