相关疑难解决方法(0)

可变值和不可变值重定义之间有什么区别?

我已经读过F#中的值是不可变的.但是,我也遇到了重新定义值定义的概念,它影响了以前的定义.这与可变值有什么不同?我这不仅仅是作为理论构造,而且还有关于何时使用可变值以及何时重新定义表达式的建议; 或者如果有人能够指出后者不是惯用的f#.

重新定义的基本示例:

let a = 1;;
a;; //1
let a = 2;;
a;; //2
Run Code Online (Sandbox Code Playgroud)

更新1:

添加到下面的答案中,顶级Fsharp交互式中的重新定义仅允许在不同的终端中.以下将在fsi中引发错误:

let a = 1
let a = 2;;

Error: Duplicate definition of value 'a'
Run Code Online (Sandbox Code Playgroud)

另一方面,let绑定允许重新定义.

更新2:实际差异,闭包不能使用可变变量:

let f =
   let mutable a = 1
   let g () = a //error
   0  
f;;
Run Code Online (Sandbox Code Playgroud)

更新3:

虽然我可以使用refs模拟副作用,例如:

let f =
   let  a = ref 1
   let g = a
   a:=2
   let x = !g  + !a
   printfn "x: %i" x //4

f;;
Run Code Online (Sandbox Code Playgroud)

我不太清楚重新定义和使用mutable关键字之间的实际区别,除了使用闭包的区别,例如:

let f  = …
Run Code Online (Sandbox Code Playgroud)

f# functional-programming immutability mutability

4
推荐指数
1
解决办法
564
查看次数