我已经读过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)