2011-04-26 81 views
1

還是真的我能避免與操作支架這樣的:我可以避免在Seq.iter中使用括號嗎?

X |> Seq.iter(fun x ->()) 

所以我想知道這是否有可能使一些技巧與管道相似與否。我已經嘗試了不同的方式,但知道我要回來就可以了,問也許我可以使用的東西不喜歡它| |

X |> Seq.iter <| fun x -> 
+2

你爲什麼要這樣做? '<|'與()相同的字符數? – Daniel 2011-04-26 14:53:01

+0

我猜 - >運算符的優先級有點太低... – LLS 2011-04-26 14:53:33

+0

我只是使用一個命名函數。 'X |> Seq.iter f' – 2011-04-26 16:21:50

回答

4

當然,你可以寫:

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不同)。

+1

Tomas,你剛剛給了我一個想法,使用'^'建立一個右聯合反向管道,'let inline(^ <|)f a = f a'。創建了我的第一個snippit:http://fssnip.net/4o – 2011-04-26 20:39:29

+0

@Stephen:剛剛注意到通過Twitter的片段:-)。好的和有用的樣本!感謝您發佈它。 – 2011-04-26 23:11:08

+0

謝謝!我喜歡 – Cynede 2011-04-27 04:39:10

2

爲了進行類型推斷,您擁有的最有可能是最好的方式。它允許功能'a -> unit知道'a的類型,因爲seq<'a>首先被給出(並且類型推斷從上到下/從左到右)。您可以通過幾種不同的方式重新排列表達式,但沒有一種可以節省擊鍵,並且可能會更加尷尬。

相關問題