F# 在F上通过引用调用#

F# 在F上通过引用调用#,f#,F#,是否有通过引用调用函数的选项 例如: 如果我在func1中有一个变量x,我想将它发送到func2,以便它可以更改它(而不返回其新值等) 1= 设可变x=1 func2x 系统控制台写入线(x) 设func2x= x您可以使用&运算符和byref关键字 let func1 = … func2 (&x) … let func2 (x : int byref) = … 有关更多信息,请参阅。您可以使用&运算符和byref关键字 let func1 =

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

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

1=
设可变x=1
func2x
系统控制台写入线(x)
设func2x=

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

let func1 =
    …
    func2 (&x)
    …

let func2 (x : int byref) =
    …

有关更多信息,请参阅。

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

let func1 =
    …
    func2 (&x)
    …

let func2 (x : int byref) =
    …

有关更多信息,请参阅。

您可以使用参考单元格:

let func1 ref = 
  ref := !ref+1

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

但是,在函数式语言中,做这类事情并不是“最佳实践”(委婉地说),您可以使用参考单元格:

let func1 ref = 
  ref := !ref+1

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

但在函数式语言中,做这类事情并不是“最佳实践”(说得委婉一点)

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

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

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

xC风格代码的严格翻译如下:

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

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

你所要求的是可能的,但这与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)
让func2x=
x+1
设func1()=
设可变x=1

你所要求的是可能的,但这与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)
让func2x=
x+1
设func1()=
设可变x=1

x惰性泛型。这意味着F#类型推断将猜测应该存在的内容(它将猜测
int
,因此x的类型是
byref
)。我认为在
func1
之后需要一个
)声明,因为它现在是一个值,而不是一个函数。尽管名称暗示它是一个函数,但它可能不是。最初的作者可能没有注意到,我也没有足够注意验证他的命名:)懒惰泛型。这意味着F#类型推断将猜测应该存在的内容(它将猜测
int
,因此x的类型是
byref
)。我认为在
func1
之后需要一个
)声明,因为它现在是一个值,而不是一个函数。尽管名称暗示它是一个函数,但它可能不是。最初的作者可能没有注意到,我也没有注意到他的名字:)正如你所看到的,在F#中通过引用传递参数当然是可能的。然而,正如我们中的一些人所指出的,这与函数式编程中的常见习惯用法非常相反。本身没有错——只是不常见。cookya因为你可能是StackOverflow的新手:通常认为通过点击左边计票下面的复选标记来接受答案是一种很好的形式。这样,如果其他人看到你的问题和答案,他们就会知道你认为你的问题是最好的答案。然而,正如我们中的一些人所指出的,这与函数式编程中的常见习惯用法非常相反。本身没有错——只是不常见。cookya因为你可能是StackOverflow的新手:通常认为通过点击左边计票下面的复选标记来接受答案是一种很好的形式。这样,如果其他人看到你的问题和答案,他们就知道你认为你的问题是最好的答案。难道<代码>函数1>代码>在声明中需要一个<代码>()>代码>实际上是一个函数吗?