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

时间:2012-04-20 20:42:49

标签: f# operators

我目前使用此功能

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

写下像

这样的东西
let str = input.[inc index]

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

let str = input.[index++]

2 个答案:

答案 0 :(得分:13)

您无法在F#中定义后缀运算符 - 请参阅4.4 Operators and Precedence。如果您同意将其作为前缀,那么您可以定义,例如,

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

并使用如下:

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

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

更新:由于fpessoa指出++ 无法确实用作真正的前缀运算符(请参阅herethere表示包含有效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")
一些人发起的已经在对原始问题的评论中表达过。

答案 1 :(得分: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])

很抱歉,但我想答案是,实际上你甚至不能这样做。