If statement 嵌套let和if语句
我在理解SML的嵌套let和ifs语法时遇到问题。例如,为什么这种语法形式不正确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。有点蠢,但是哦 那么,为
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