1

是否有通过引用调用函数的选项?

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

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

let func2 x =
    x <- x + 1

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

是否可以?如果是这样,怎么做?

谢谢。

4

4 回答 4

2

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

let func1 =
    …
    func2 (&x)
    …

let func2 (x : int byref) =
    …

有关详细信息,请参阅MSDN:参考单元 (F#)

于 2012-04-25T11:32:02.917 回答
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)
于 2012-04-25T11:42:07.777 回答
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之前对其进行定义。

于 2012-04-25T13:42:37.270 回答
1

您可以使用参考单元格:

let func1 ref = 
  ref := !ref+1

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

但是用函数式语言做这些事情并不是“最佳实践”(委婉地说)

于 2012-04-25T11:32:32.123 回答