导致错误的打印语句?
print statement causing error?
这种语言的语法令人困惑。
fun bar a =
print (Int.toString a);
0
编译。不知道为什么 emacs 会缩进 0。
fun bar a =
print (Int.toString a)
0
引发错误。
Error: operator is not a function [tycon mismatch]
operator: unit
in expression:
(print (Int.toString a)) 0
fun foo a =
if a < 0
then
0
else
0
编译。
fun foo a =
if a < 0
then
print (Int.toString a);
0
else
0
抛出错误。
syntax error: replacing SEMICOLON with EQUALOP
哇?
我无法理解这一点。
您似乎无法理解 SML 中哪些地方可以使用分号。主要有两个地方允许使用:
括号内的组:(a; b)
。这意味着 a; b
无效。您需要将其括在括号内。
在 in
和 end
之间,在 let
块中。但是,您不要在此处加括号:
let
val foo = ...
in
a;
b;
c
end
所以,你的最后一个例子应该是:
fun foo a =
if a < 0
then (print (Int.toString a); 0)
else 0
它们也可用于分隔文件内或 REPL 中的顶级表达式或声明,但出于此目的它们是可选的。这就是编译第一个示例的原因。
这种语言的语法令人困惑。
fun bar a =
print (Int.toString a);
0
编译。不知道为什么 emacs 会缩进 0。
fun bar a =
print (Int.toString a)
0
引发错误。
Error: operator is not a function [tycon mismatch]
operator: unit
in expression:
(print (Int.toString a)) 0
fun foo a =
if a < 0
then
0
else
0
编译。
fun foo a =
if a < 0
then
print (Int.toString a);
0
else
0
抛出错误。
syntax error: replacing SEMICOLON with EQUALOP
哇?
我无法理解这一点。
您似乎无法理解 SML 中哪些地方可以使用分号。主要有两个地方允许使用:
括号内的组:
(a; b)
。这意味着a; b
无效。您需要将其括在括号内。在
in
和end
之间,在let
块中。但是,您不要在此处加括号:
let
val foo = ...
in
a;
b;
c
end
所以,你的最后一个例子应该是:
fun foo a =
if a < 0
then (print (Int.toString a); 0)
else 0
它们也可用于分隔文件内或 REPL 中的顶级表达式或声明,但出于此目的它们是可选的。这就是编译第一个示例的原因。