使用F#对可变值进行模式匹配

3

我想指出F#中一个“有风险”的部分。请看下面的代码:

let mutable a, b as ab = 0, 0
a <- 4
a
ab

你将会得到 a = 4ab = 0, 0。这可能是正确的行为,我只是想指出并了解你的意见。你认为这种行为是否合理,为什么?我有些难以接受,因为我一直认为 (a, b) 和 ab 应该是相同的。
2个回答

6

如果你在 F# 交互环境中运行 let mutable a, b as ab = 0, 0,你会得到:

val mutable ab : int * int = (0, 0)
val mutable b : int = 0
val mutable a : int = 0

这意味着该表达式已创建3个不同且独立的值。修改一个值不会影响其他值。

3

虽然一开始可能会让人感到困惑,但一旦你理解了 F# 如何处理声明(如 Ankur 所解释的那样),它应该就很容易理解了。

如果你使用引用单元而不是可变变量,则可以获得另一种行为(其中修改一个值也会修改元组):

let a, b as ab = ref 0, ref 0
a := 4
!(fst ab) // returns 4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接