【问题标题】:Ml syntax error, how to verify code error?ML语法错误,如何验证代码错误?
【发布时间】:2011-06-12 21:46:05
【问题描述】:

我是新手。我写下面的代码。

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
lazy.sml:15.21 错误:语法错误:插入 LPAREN
lazy.sml:17.1 错误:EOF 处发现语法错误

这些错误是什么意思?

【问题讨论】:

    标签: sml ml


    【解决方案1】:

    在 SML 中,错误往往会级联,即一个故障可以在故障定位后引起大量错误。因此,一个好的策略是只查看第一个错误,纠正它,然后重试代码。

    如果我们查看您的第一个错误:

    lazy.sml:1.13 Error: syntax error: inserting LPAREN
    

    ,我们可以看出是第一行引起的。如果我们看一下,这就是 sml 的解释方式;取函数Delay,发送e作为参数,得到一个新函数作为结果。取这个函数并发送 == 作为参数,然后得到另一个函数,lambda 函数 fn () =&gt; e 被传递给它。但是,SML 语法规定,为了将 lambda 函数作为参数传递,它们必须用括号括起来,因此它会发出缺少左括号的错误,这被神秘地写成“插入 LPAREN”。

    但是,我看不出前两行的目的是什么,因为其余的代码独立于它,而且语法也几乎正确,所以现在我将简单地将它们注释掉(用“( *”和“*)”。

    让我们运行新代码并查看第一个新错误:

    lazy.sml:7.4-8.4 Error: syntax error: deleting  IN FUN
    

    现在我们把注意力转向第八行,发现它和第九行错误地加上了“fun”前缀。我们将第 8 行和第 9 行的“有趣”替换为空格,然后再次运行。

    现在可以了!这是工作代码:

    (* 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)));
    

    如您所见,错误多于错误,我希望您已经了解到,解码错误消息的含义是不必要的,只需查看第一个错误的位置通常就足以了解错了。

    【讨论】:

      猜你喜欢
      • 2011-05-11
      • 2018-11-11
      • 2018-07-08
      • 2011-05-22
      • 1970-01-01
      • 2017-10-03
      • 2017-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多