导致错误的打印语句?

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 中哪些地方可以使用分号。主要有两个地方允许使用:

  1. 括号内的组:(a; b)。这意味着 a; b 无效。您需要将其括在括号内。

  2. inend 之间,在 let 块中。但是,您不要在此处加括号:

let
  val foo = ...
in
  a;
  b;
  c
end

所以,你的最后一个例子应该是:

fun foo a =
  if a < 0
  then (print (Int.toString a); 0)
  else 0

它们也可用于分隔文件内或 REPL 中的顶级表达式或声明,但出于此目的它们是可选的。这就是编译第一个示例的原因。