F#可变函数参数

时间:2010-09-23 13:56:03

标签: f#

有没有办法在F#中使用可变函数参数,这样可以允许像

这样的东西
let mutable i = 9

let somefun n = n <- 12; ()

somefun i

(* *not* a real-world example *)

我知道可以通过将其包装到记录类型

来实现
type SomeRec = { mutable i: int }

let ri = { i = 9 }

let someotherfun r = r.i <- 12; ()

并且可以以类似的方式为类成员完成。然而,即使在浏览了整个F#语言规范之后(是的,我做了!),似乎没有语法允许第一种情况,并且编译器似乎对我尝试这一点非常不满意。我希望会有某种类型的注释,但是不可能在这种情况下使用。

我也知道我不应该首先做这种事情,但第一种情况(int绑定)和第二种情况(record类型)在语义上是相同的,任何这种反对意见同样适用于两种情况。

所以我认为我在这里遗漏了一些东西。

2 个答案:

答案 0 :(得分:15)

您可以使用ref作为参数

let v = ref 0
let mutate r = 
    r := 100
mutate v
printfn "%d" !v

或byref关键字

let mutable v = 0
let mutate (r : byref<_>) = 
    r <- 100
mutate &v
printfn "%d" v

答案 1 :(得分:9)

使用等于C#byref的{​​{1}}关键字。 请参阅http://msdn.microsoft.com/en-us/library/dd233213.aspx

上的“通过引用传递”部分