【问题标题】:Standard ML - Update global variable within a let-in-end expression?标准 ML - 在 let-in-end 表达式中更新全局变量?
【发布时间】:2013-04-05 18:59:47
【问题描述】:

有什么方法可以在 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。

谢谢

【问题讨论】:

    标签: scope standards global sml ml


    【解决方案1】:

    在 ML 中永远不能分配“变量”。 playerScore 的值一旦初始化就永远不会改变。期间。

    在您的示例中,您在内部范围内声明了一个名为 playerScorenew 变量,该变量隐藏了外部。它是一个不同的变量,与外部的同名变量没有关系。

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

    【讨论】:

      猜你喜欢
      • 2014-01-01
      • 2018-06-24
      • 1970-01-01
      • 2016-04-03
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      相关资源
      最近更新 更多