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

问题描述

所以我想打印一个列表,其中包含最大为 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 ; 在语法上是不正确的 ;

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