嵌套的 let 和 if 语句
nested let and if statements
我在理解嵌套 let
和 if
的 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
-分支具有类型 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
s,因此如果您想在代码中分配给 a
,则需要将其分配给int ref
而不是普通的 int
.
我在理解嵌套 let
和 if
的 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
-分支具有类型 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
s,因此如果您想在代码中分配给 a
,则需要将其分配给int ref
而不是普通的 int
.