我目前使用此功能如何在F#中定義x ++(其中x:int ref)?
let inc (i : int ref) =
let res = !i
i := res + 1
res
寫東西像
let str = input.[inc index]
如何定義遞增運算符++,這樣我就可以寫
let str = input.[index++]
我目前使用此功能如何在F#中定義x ++(其中x:int ref)?
let inc (i : int ref) =
let res = !i
i := res + 1
res
寫東西像
let str = input.[inc index]
如何定義遞增運算符++,這樣我就可以寫
let str = input.[index++]
中不能定義後綴運算符F# - 見4.4 Operators and Precedence。如果您同意使它的前綴,而不是,那麼你可以定義,例如,
let (++) x = incr x; !x
和如下使用它:
let y = ref 1
(++) y;;
val y : int ref = {contents = 2;}
UPDATE:爲fpessoa指出++
不能是確實用作真正的前綴運算符(關於包含有效的F#前綴運算符的字符和字符序列的規則,請參見here和there)。
有趣的是,一元+
可以被重載爲目的:
let (~+) x = incr x; !x
允許
let y = ref 1
+y;;
val y : int ref = {contents = 2;}
儘管如此,是有意義提及迭代的陣列等的想法下面
let v = [| 1..5 |]
let i = ref -1
v |> Seq.iter (fun _ -> printfn "%d" v.[+i])
爲了「可讀性」至少看起來st範圍與慣用的功能性方式相比
[|1..5|] |> Seq.iter (printfn "%d")
哪些人已經發起了對原始問題的評論。
我試圖把它寫成前綴運算符的建議,但是你不能將(++)定義爲一個合適的前綴運算符,也就是說,像沒有()的情況下運行++對於(!+):
let (!+) (i : int ref) = incr i; !i
let v = [| 1..5 |]
let i = ref -1
[1..5] |> Seq.iter (fun _ -> printfn "%d" v.[!+i])
對不起,但我想答案是,實際上你甚至不能這樣做。
一個問題:爲什麼你需要這個? – pad 2012-04-20 21:03:11
我與@pad在這一個 - 雖然問題是有效的,並且已經提供了一個答案(作爲前綴運算符),這裏給出的示例根本不是F#樣式。很少有這樣做的好理由。 – yamen 2012-04-20 21:12:47
爲了便於閱讀,我想這樣做。 (我來自C++/C#背景)。我雖然有可能但不能自己做。 – 2012-04-20 21:21:38