嵌套的 let 和 if 语句

nested let and if statements

我在理解嵌套 letif 的 SML 语法时遇到问题。例如,为什么这在语法上是错误的?

fun stuff a =
  let
      val p = 2
  in
      if a = 1
      then
      let 
          val r = p 
      in
          a = r
      end
      else
      0
  end

如果a为1则使a等于r,如果a不为1则不在第一个创建r地方和 return 0. 有点愚蠢,但是哦...

那么,为什么这在语法上不正确?

语法上没有错误。然而,这是一个类型错误。

问题是 if 的两个分支需要具有相同的类型,而您的 then-分支具有类型 boola = b 是比较,不是赋值,但如果它是赋值,它的类型是 unit,这也是错误的类型)并且你的 else-分支的类型是 int。您可以通过在 else 分支中返回一个布尔值来编译代码,如下所示:

fun stuff a =
  let
    val p = 2
  in
    if a = 1
    then
      let 
        val r = p 
      in
        a = r
      end
    else
      false
  end

PS:请注意,您只能在 SML 中分配给 refs,因此如果您想在代码中分配给 a,则需要将其分配给int ref 而不是普通的 int.