0

私は初心者です。以下のコードを書きます。

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エラー:構文エラー:SEMICOLONのEQUALOPへの置き換え
lazy.sml:15.21エラー:構文エラー:LPARENの挿入
lazy.sml:17.1エラー:EOFで構文エラーが見つかりました

これらのエラーはどういう意味ですか?

4

1 に答える 1

4

SML では、エラーがカスケードすることがよくあります。つまり、1 つの障害によって、障害の場所の後に多くのエラーが発生する可能性があります。したがって、最初のエラーのみを確認して修正し、コードを再試行することをお勧めします。

最初のエラーを見ると:

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

、最初の行が原因であることがわかります。それを見ると、これが sml によって解釈される方法です。関数 Delay を受け取り、引数として e を送信し、結果として新しい関数を取得します。この関数を取り、引数として == を送信し、ラムダ関数fn () => eが渡されるさらに別の関数を取得します。ただし、SML 構文では、ラムダ関数を引数として渡すには、それらを括弧で囲む必要があると規定されているため、左括弧が見つからないというエラーが発生します。

ただし、最初の 2 行の目的がわかりません。コードの残りの部分はそれとは独立しており、構文もほぼ正しいため、ここでは単純にコメントアウトします ("(*" で囲み、 "*)".

新しいコードを実行して、最初の新しいエラーを見てみましょう。

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

ここで 8 行目に注意を向けると、それと 9 行目に誤って "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)));

おわかりのように、間違いよりも多くのエラーがありました。エラー メッセージの意味を解読する必要はなく、多くの場合、最初のエラーの場所を見るだけで何が悪いのかを理解するのに十分であることがわかったと思います。

于 2011-06-12T13:46:05.183 に答える