0

次のコードは正しく機能します。

local 
  exception exc;
  fun a 0 = 0
    | a n = if (n>0) then n+ b (n-1) else raise exc
  and b 0 = 0
    | b n = if (n>0) then n+ a (n-1) else raise exc
in
  fun some n = a n
  handle exc => 0;
end;

some ~4;

val some = fn : int -> int
val it = 0 : int

しかし、 in..end部分の中に次の変更を追加すると

in
  fun some n = a n
  and some2 n = b n
  handle exc => 0;
end;

そして同じ電話をかけるsome ~4;

次の出力が得られます。

val some = fn : int -> int
val some2 = fn : int -> int
E:\Program Files\SML_NJ\\bin\.run\run.x86-win32.exe: Fatal error -- Uncaught exception exc with 0

E:\GenCS\SML tutorial\some2.sml:181.49-181.52 で発生

例外がキャッチされないのはなぜですか? 希望する動作を得るには、コードをどのように変更すればよいですか?

4

1 に答える 1

1

handle関数 some2 にのみ適用されます。両方の関数で例外を処理する場合は、

fun some n = a n handle exc => 0
and some2 n = b n handle exc => 0
于 2013-11-02T19:25:56.830 に答える