If statement 嵌套let和if语句

If statement 嵌套let和if语句,if-statement,syntax,sml,let,If Statement,Syntax,Sml,Let,我在理解SML的嵌套let和ifs语法时遇到问题。例如,为什么这种语法形式不正确 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,则生成一个相等的tor;如果a不是1,则不首先创建r并返回0。有点蠢,但是哦 那么,为

我在理解SML的嵌套let和ifs语法时遇到问题。例如,为什么这种语法形式不正确

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,则生成一个相等的tor;如果a不是1,则不首先创建r并返回0。有点蠢,但是哦


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

它在语法上不是不正确的。但是,这是一个类型错误

问题是if的两个分支需要具有相同的类型,而您的then分支具有类型bool a=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

注意,您只能在SML中分配给ref,因此如果您想在代码中分配给a,您需要将其设置为int ref而不是普通int。

它在语法上并不错误。但是,这是一个类型错误

问题是if的两个分支需要具有相同的类型,而您的then分支具有类型bool a=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
注意,您只能在SML中分配给ref,因此如果您想在代码中分配给a,您需要将其设置为int ref而不是普通int