gpt4 book ai didi

f# - 在 F# 中不可变

转载 作者:行者123 更新时间:2023-12-04 04:52:06 25 4
gpt4 key购买 nike

我知道 F# 中的变量默认是不可变的。
但是,例如在 F# 交互中:

  > let x = 4;;

val x : int = 4

> let x = 5;;

val x : int = 5

> x;;
val it : int = 5
>

因此,我将 4 分配给 x,然后将 5 分配给 x,它正在发生变化。这是正确的吗?它应该给出一些错误或警告吗?或者我只是不明白它是如何工作的?

最佳答案

当你写 let x = 3 ,您正在绑定(bind)标识符 x到值 3 .如果您在同一范围内再次执行此操作,则您声明了一个新标识符,该标识符隐藏了前一个标识符,因为它具有相同的名称。

在 F# 中改变一个值是通过破坏性更新运算符 <- 完成的。 .对于不可变的值,这将失败,即:

> let x = 3;;

val x : int = 3

> x <- 5;;

x <- 5;;
^^^^^^

stdin(2,1): error FS0027: This value is not mutable

要声明可变变量,请添加 mutablelet 之后:
let mutable x = 5;;

val mutable x : int = 5

> x <- 6;;
val it : unit = ()
> x;;
val it : int = 6

但你可能会问,这两者有什么区别?一个例子可能就足够了:
let i = 0;
while i < 10 do
let i = i + 1
()

尽管看起来,这是一个无限循环。 i在循环内声明的是不同的 i隐藏外部的。外层是不可变的,所以它总是保持它的值 0并且循环永远不会结束。正确的写法是使用可变变量:
let mutable i = 0;
while i < 10 do
i <- i + 1
()

关于f# - 在 F# 中不可变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11157358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com