嵌套的let和if语句

时间:2016-04-21 19:46:46

标签: if-statement syntax sml let

我在理解嵌套letif s的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返回0.有点傻,但是好吧......

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

1 个答案:

答案 0 :(得分:4)

语法不正确。但这是一个类型错误。

问题是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中分配ref,因此如果您想在代码中分配a,则需要将其设为{{1}而不是普通的int ref