12

我目前使用这个功能

let inc (i : int ref) =
    let res = !i
    i := res + 1
    res

写东西

let str = input.[inc index]

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

let str = input.[index++]
4

2 回答 2

13

您不能在 F# 中定义后缀运算符 - 请参阅4.4 运算符和优先级。如果您同意将其设为前缀,则可以定义,例如,

let (++) x = incr x; !x

并使用它如下:

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

val y : int ref = {contents = 2;}

更新:正如fpessoa指出的那样,确实++ 不能用作真正的前缀运算符(请参阅此处此处了解包含有效 F# 前缀运算符的字符和字符序列的规则)。

有趣的是,+为了达到以下目的,可以重载一元:

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])

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

[|1..5|] |> Seq.iter (printfn "%d")

一些人已经在对原始问题的评论中表达了这一点。

于 2012-04-20T20:54:20.663 回答
4

我试图按照建议将其编写为前缀运算符,但您不能将 (++) 定义为正确的前缀运算符,即,在没有 () 的情况下运行 ++y 之类的东西,例如 (!+ ):

let (!+) (i : int ref) = incr i; !i

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

对不起,但我想答案是实际上你甚至不能这样做。

于 2012-04-20T21:31:53.703 回答