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

时间:2011-06-30 06:35:18

标签: f# pattern-matching mutable

我想在F#中指出'风险'部分。请考虑以下代码

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

您将获得a = 4ab = 0, 0。这可能是一种正确的行为,我只想指出并了解你的意见。你觉得这种行为是否合乎逻辑,为什么?我有一些问题需要接受,因为我一直认为(a,b)和ab应该是相同的。

2 个答案:

答案 0 :(得分:5)

如果您在F#interactive中运行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个不同且独立的值。修改一个值不会影响其他值

答案 1 :(得分:4)

事实上,这可能会让人感到困惑,但是一旦你理解了F#如何处理声明(正如Ankur所解释的那样),它应该是有道理的。

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

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