重新定义的基本示例:
let a = 1;;
a;; //1
let a = 2;;
a;; //2
更新1:
除下面的答案之外,F#交互环境中顶层的重定义只允许在不同的终止符中进行。以下代码也会在fsi中报错:
let a = 1
let a = 2;;
Error: Duplicate definition of value 'a'
另一方面,在let绑定中允许重新定义。更新2:实际上的区别在于,闭包无法使用可变变量。
let f =
let mutable a = 1
let g () = a //error
0
f;;
更新3:
尽管我可以使用refs对副作用进行建模,例如:
let f =
let a = ref 1
let g = a
a:=2
let x = !g + !a
printfn "x: %i" x //4
f;;
除了与闭包的使用方式不同之外,我无法完全看出重新定义和使用可变关键字之间的实际区别:
let f =
let a = 1
let g = a
let a = 2
let x = g + a
printfn "x: %i" x //3
f;;
vs
let f =
let mutable a = 1
let g = a
a <-2
let x = g + a
printfn "x: %i" x //3
f;;
另一种思路:我不确定如何处理线程,但(a)另一个线程可以在let绑定内改变可变变量的值吗?(b)另一个线程可以重新绑定/重新定义let绑定中的值名称吗?我肯定在这里漏掉了什么。
更新4: 最后一种情况的区别在于,突变仍将从嵌套作用域进行,而在嵌套作用域中的重新定义/重新绑定将“遮盖”来自外部作用域的定义。
let f =
let mutable a = 1
let g = a
if true then
a <-2
let x = g + a
printfn "x: %i" x //3
f;;
vs
let f =
let a = 1
let g = a
if true then
let a = 2
printfn "a: %i" a
let x = g + a
printfn "x: %i" x //2
f;;