2010-09-23 129 views
8

有没有办法在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#语言规范(是的,我做过!)之后,似乎没有允许第一种情况的语法,编译器似乎对我的尝试非常不满。我希望会有某种类型的注释,但mutable不能用于这种情况。

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

所以我觉得我在这里失去了一些东西。

+8

如果您需要改变参数,您仍然认为命令性的。你能准确地描述你想要做什么,也许有人可以建议一个更习惯的解决方案。 – Juliet 2010-09-23 14:52:36

回答

14

您可以使用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 
+3

注意'byref'就像C#'ref'。如果你需要C#'out',那么使用'byref',但是也可以在参数中添加'[]'属性。 – Brian 2010-09-23 14:46:02

+3

这个答案在技术上是正确的,但我会在实践中看到它的使用。 OP应该坚持使用F#方式,而不是试图用一种不同的语法编写C#。 – Juliet 2010-09-23 15:03:04

+3

@Juliet这可能比F#中的功能等价性要快很多。我在生产代码中使用了这个。 – 2013-01-03 19:01:00

8

使用byref关键字是等于C#ref。 请参阅“通过引用传递”部分http://msdn.microsoft.com/en-us/library/dd233213.aspx

+0

哦,亲爱的,我还缺少一些基本的东西。我想这是重新阅读整个事情*再次*。对不起,我只能标记一个'已接受'的答案,但会投票给这个答案。 – 2010-09-23 14:25:50

+0

我刚刚发现Jon Skeet关于传递参数的文章:http://www.yoda.arachsys.com/csharp/parameters.html它在C#上,但这正是您现在需要的。 – 2010-09-23 14:35:28