ml语法错误,如何验证代码错误?

| 我是新生。我写下面的代码。
Delay(e) == fn () => e
Force(e) == e()

fun time_consuming(n) =
   let fun tak(x, y, z) = if x <= y then y
               else tak(tak(x-1,y,z), tak(y-1,z,x), tak(z-1,x,y))
   in          
fun   tak(3*n, 2*n, n)
funend;
fun fib(n) = if n=0 orelse n=1 then 1 else fib(n-1) + fib(n-2);
fun odd(n) = (n mod 2) = 1;
fun f(x, y) = if odd(x) then 1 else fib(y);
f(fib(9), time_consuming(9));

fun lazy_f(x, y) = if odd(x) then 1 else fib(y());
lazy_f(fib(9), fn () => (time_consuming(9)));
这是懒惰的评估代码。 但这有一些错误。   lazy.sml:1.13错误:语法错误:插入LPAREN   lazy.sml:4.2错误:语法错误:插入LET   lazy.sml:12.44错误:语法错误:用EQUALOP替换SEMICOLON   lazy.sml:15.21错误:语法错误:插入LPAREN   lazy.sml:17.1错误:在EOF处发现语法错误 这些错误是什么意思?     
已邀请:
        在SML中,错误通常会级联,也就是说,一个故障在定位故障之后会导致大量的错误。因此,一个好的策略是仅查看第一个错误,更正错误,然后重试代码。 如果我们看您的第一个错误:
lazy.sml:1.13 Error: syntax error: inserting LPAREN
,我们可以看到它是由第一行引起的。如果我们看一下,这就是sml对它的解释。取函数Delay,发送e作为参数,然后得到一个新函数。将此函数并以==作为参数发送并获得另一个函数,lambda函数
fn () => e
传递给该函数。但是,SML语法规定,为了将lambda函数作为参数传递,必须将其包围在括号中,因此会发出缺少左括号的错误,该错误地写为“插入LPAREN”。 但是,我看不出前两行的目的是什么,因为代码的其余部分是独立的,并且在语法上也几乎是正确的,所以现在我将它们简单地注释掉(用\“(**围起来) “和\” *)\“。 让我们运行新代码并查看第一个新错误:
lazy.sml:7.4-8.4 Error: syntax error: deleting  IN FUN
现在我们将注意力转向第八行,看到它和第九行被错误地加了“有趣”的前缀。我们将第8行和第9行的\“ fun \\”替换为空格,然后再次运行。 现在可以了!这是工作代码:
(* Delay(e) == fn () => e *)
(* Force(e) == e() *)

fun time_consuming(n) =
   let fun tak(x, y, z) = if x <= y then y
               else tak(tak(x-1,y,z), tak(y-1,z,x), tak(z-1,x,y))
   in          
      tak(3*n, 2*n, n)
   end;
fun fib(n) = if n=0 orelse n=1 then 1 else fib(n-1) + fib(n-2);
fun odd(n) = (n mod 2) = 1;
fun f(x, y) = if odd(x) then 1 else fib(y);
f(fib(9), time_consuming(9));

fun lazy_f(x, y) = if odd(x) then 1 else fib(y());
lazy_f(fib(9), fn () => (time_consuming(9)));
如您所见,错误多于错误,我希望您已经了解到,解码错误消息的含义不是必需的,仅查看第一个错误的位置通常就足以了解错误所在。     

要回复问题请先登录注册