Syntax 导致错误的打印语句?
这种语言的语法令人困惑Syntax 导致错误的打印语句?,syntax,sml,smlnj,Syntax,Sml,Smlnj,这种语言的语法令人困惑 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
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
syntax error: replacing SEMICOLON with EQUALOP
沃特
我搞不懂这一点。看来你很难理解在SML中分号可以用在哪里。有两个主要的地方允许他们:
(a;b)
。这意味着a;b
无效。你需要把它用括号括起来中的和中的结束之间,让
阻塞。但是,此处不使用括号:
fun foo a =
if a < 0
then (print (Int.toString a); 0)
else 0
fun foo a=
如果a<0
然后(打印(Int.toString a);0)
其他0
它们还可以用于分隔文件内或REPL中的顶级表达式或声明,但出于此目的,它们是可选的。这就是为什么要编译您的第一个示例。您似乎很难理解在SML中分号可以用在哪里。有两个主要的地方允许他们:
(a;b)
。这意味着a;b
无效。你需要把它用括号括起来中的和中的结束之间,让
阻塞。但是,此处不使用括号:
fun foo a =
if a < 0
then (print (Int.toString a); 0)
else 0
fun foo a=
如果a<0
然后(打印(Int.toString a);0)
其他0
它们还可以用于分隔文件内或REPL中的顶级表达式或声明,但出于此目的,它们是可选的。这就是为什么要编译您的第一个示例。部分混淆可能源于一些标准书籍(如乌尔曼的)过度使用分号的方式。分号主要是终止符而不是分隔符,这很容易给人留下这样的印象。有没有办法将print语句用作if/else分支中的最后一条语句,而不从该分支返回()?这种语言感觉像一件紧身胸衣…@lotolmencre
如果为true,则打印(“foo”)else()
。print
语句已经是一个单元函数。您可以使用另一个函数fun printIfTrue(test,val)=if test then print(val)else()
将其封装起来。部分混淆可能是由于一些标准书籍(如Ullman的)过度使用分号造成的。分号主要是终止符而不是分隔符,这很容易给人留下这样的印象。有没有办法将print语句用作if/else分支中的最后一条语句,而不从该分支返回()?这种语言感觉像一件紧身胸衣…@lotolmencre如果为true,则打印(“foo”)else()
。print
语句已经是一个单元函数。您可以使用另一个函数funprintiftrue(test,val)=if-test-then-print(val)else()
来包装它。
fun foo a =
if a < 0
then (print (Int.toString a); 0)
else 0