“我可以像那样在一个 sml 函数中写 2 条指令吗?

"Can I write 2 instructions in one sml function like that '?

所以我想打印一个列表,其中包含最多 n 个数字的所有平方。(在 sml nj 中)

Example 
>printl 3 ;
> [0,1,4,9]

问题是我必须使用这个函数“creat”打印它们,它创建了一个列表:

(*print elements squares up to n*)
fun printl n =
( print(Int.toString(hd (creat n [])));  printl(n-1); );

(*creat a list *)
fun creat n acc = if n<0 then acc
else (creat (n-1) ((n*n)::acc) );

如您所见,我尝试使用 [] 调用“creat”以创建最多 n 的所需方块列表,然后我尝试打印头部,同时递归调用剩下的部分(printl n -1).

我生成了这个错误 但是: sml square.sml:2.55 Error: syntax error: replacing RPAREN with LET 所以我猜 printl 中的指令数量有问题吗?

问题出在 printl(n-1) 之后的分号,因为您的 编译器等待另一个表达式。因此,错误消息 这意味着他不会在这里接受 ),而是接受 let。所以就 删除那个分号。

注意分号有两种不同的含义:

  • 对表达式 a ; b ; c 进行排序。所以在那种情况下 a ; b ; 在语法上是不正确的 ;

  • 或者在顶层标记声明的结束,以便按顺序 让编译器知道你已经完成了当前的定义(如 你已经完成了你的两个功能)。