通过F#引用调用

时间:2012-04-25 11:15:53

标签: f#

是否可以通过引用调用函数?

例如: 如果我在func1中有一个变量x并且我想将它发送到func2,那么它可以改变它(不返回它的新值等)。

let func1 =
    let mutable x = 1
    func2 x
    System.Console.WriteLine(x)

let func2 x =
    x <- x + 1

所以调用func1会打印“2”..

有可能吗?如果是这样,怎么样?

感谢。

4 个答案:

答案 0 :(得分:2)

您可以使用&运算符和byref关键字。

let func1 =
    …
    func2 (&x)
    …

let func2 (x : int byref) =
    …

有关详细信息,请参阅MSDN: Reference cells (F#)

答案 1 :(得分:2)

C#风格代码的严格翻译是这样的:

let func2 (x : byref<_>) =
    x <- x + 1

let func1 =
    let mutable x = 1
    func2 &x
    System.Console.WriteLine(x)

但强烈建议坚持参考。

编辑:正如所指出的那样(见注释),你可能意味着func1将是一个函数:

let func2 (x : byref<_>) =
    x <- x + 1

let func1 () =
    let mutable x = 1
    func2 &x
    System.Console.WriteLine(x)

答案 2 :(得分:2)

你所要求的是可能的,但它与F#鼓励的功能方法完全相反。是否有一些强有力的理由你不能这样做:

let func2 x =
   x + 1

let func1() =
    let x = 1
    let y = func2 x
    System.Console.WriteLine(y)

这是在函数式编程(和F#)中执行此类操作的更惯用的方法。或者,如果你必须改变x那么这个:

let func2 x =
   x + 1

let func1() =
    let mutable x = 1
    x <- func2 x
    System.Console.WriteLine(x)

顺便说一句,在F#中,func2必须在之前定义

答案 3 :(得分:1)

您可以使用参考单元格:

let func1 ref = 
  ref := !ref+1

let func2 () = 
  let x = ref 1
  func1 x
  System.Console.WriteLine(!x)

但这不是'最佳实践'(温和地说)用功能语言来做这些事情