我是个新人。我写下面的代码。
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中找到语法错误
这些错误意味着什么?
答案 0 :(得分:4)
在SML中,错误通常会级联,也就是说,一个错误可能会在故障定位后导致错误加载。因此,一个好的策略是只查看第一个错误,更正它,然后重试代码。
如果我们查看您的第一个错误:
lazy.sml:1.13 Error: syntax error: inserting LPAREN
,我们可以看到它是由第一行引起的。如果我们看一下,这就是sml解释它的方式;取函数Delay,发送e作为参数,得到一个新函数作为结果。使用此函数并发送==作为参数并获取另一个函数,lambda函数fn () => e
将传递给该函数。但是,SML语法规定,为了将lambda函数作为参数传递,它们必须被parantheses包围,因此它会发出错过左侧parantheses的错误,这种错误被加密写为“插入LPAREN”。
但是,我没有看到前两行的目的是什么,因为其余的代码是独立的,而且语法也几乎正确,所以现在我只是简单地将它们注释掉(用它们包围它们“( *“和”*)“。
让我们运行新代码并查看第一个新错误:
lazy.sml:7.4-8.4 Error: syntax error: deleting IN FUN
现在我们将注意力转向第八行,并且看到它和第九行错误地以“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)));
正如您所看到的,错误多于错误,我希望您已经了解到解码错误消息的含义是不必要的,只需查看第一个错误的位置通常就足以实现是错的。