如何在F#中定义x ++(其中x:int ref)?

boh*_*nko 12 f# operators

我目前使用这个功能

let inc (i : int ref) =
    let res = !i
    i := res + 1
    res
Run Code Online (Sandbox Code Playgroud)

写点东西

let str = input.[inc index]
Run Code Online (Sandbox Code Playgroud)

如何定义增量运算符++,以便我可以编写

let str = input.[index++]
Run Code Online (Sandbox Code Playgroud)

Gen*_*ski 13

您无法在F#中定义后缀运算符 - 请参阅4.4运算符和优先级.如果您同意将其作为前缀,那么您可以定义,例如,

let (++) x = incr x; !x
Run Code Online (Sandbox Code Playgroud)

并使用如下:

let y = ref 1
(++) y;;

val y : int ref = {contents = 2;}
Run Code Online (Sandbox Code Playgroud)

UPDATE:为fpessoa指出,++ 不能作为一个真正的前缀运营商,确实(见这里和那里用于在字符,包括有效的F#前缀运算符的字符序列的规则).

有趣的是,一元+可以为此目的超载:

let (~+) x = incr x; !x
Run Code Online (Sandbox Code Playgroud)

允许

let y = ref 1
+y;;

val y : int ref = {contents = 2;}
Run Code Online (Sandbox Code Playgroud)

然而,有必要提到迭代数组的想法,如下所示

let v = [| 1..5 |] 
let i = ref -1 
v |> Seq.iter (fun _ -> printfn "%d" v.[+i])
Run Code Online (Sandbox Code Playgroud)

为了"可读性",与惯用功能方式相比,至少看起来很奇怪

[|1..5|] |> Seq.iter (printfn "%d")
Run Code Online (Sandbox Code Playgroud)

一些发起人已经在对原始问题的评论中表达过.