我在理解嵌套let
和if
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.有点傻,但是好吧......
那么,为什么这在语法上是不正确的?
答案 0 :(得分:4)
语法不正确。但这是一个类型错误。
问题是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
PS:请注意,您只能在SML中分配ref
,因此如果您想在代码中分配a
,则需要将其设为{{1}而不是普通的int ref
。