标准ML - 在let-in-end表达式中更新全局变量?

时间:2013-04-13 06:45:27

标签: scope standards global sml ml

有没有办法在let-in-end表达式中更新全局范围内绑定的变量?

例如,如果我有一个全局变量:

val playerScore = 0; 

然后是函数:

fun hit (option:int) = 
    if option = 2 then
        printStay(playerScore, dealerScore)
    else 
        let
            val cardDrawn = showCard(hd deck)
            val playerScore = playerScore + getValue(hd deck)
        in 
            print ("You chose to hit\n" ^ cardDrawn ^ "Dealer Score: " ^ Int.toString(dealerScore) ^ "\nPlayer Score: " ^ Int.toString(playerScore) ^ "\n")  
        end; 

playerScore的值在let表达式中更新,并在“in”子句中输出正确的值,但不保存playerScore的实际值,并在此表达式完成后重置。

在此表达式执行后,是否仍然保留playerScore在全局级别的值?问题是我无法跟踪分数,因为它每次都会重置为0。

由于

1 个答案:

答案 0 :(得分:8)

永远不能在ML中分配“变量”。初始化后playerScore的值永远不会改变。周期。

在您的示例中,您在内部作用域中声明了一个名为playerScore new 变量,该变量隐藏了外部作用域。它是一个不同的变量,与同名的外部变量无关。

如果要使用可变性,可以使用可变数据结构,其中最简单的是“ref”单元格,它是单项可变单元格。您可以使用ref函数创建ref数据结构,使用!运算符访问其内容,使用:=运算符更改其内容。但突变只发生在可变数据结构上,如ref,数组等。变量不能改变。