次のコードを考えると:
exception E of int;
fun g(y) = raise E(y);
fun f(x) =
let
exception E of real;
fun z(y)= raise E(y);
in
x(3.0);
z(3)
end;
f(g);
SML でコードを実行すると、次のようになります。
stdIn:216.8-216.12 Error: operator and operand don't agree [literal]
operator domain: real
operand: int
in expression:
z 3
z(3);それは結構です - 行がエラーを引き起こすzことを理解していintますreal.
しかし、私の問題は行x(3.0);にあります。なぜエラーが発生しないのですか?
私の理解でxはg(y)、 を実行すると、x(3.0)実際には を実行しますが、タイプ の例外のみをスローしますが、値に渡したので、値をスローするので、違反になるはずですよね?g(3.0)gintg3.0greal
実行時にエラーが発生しない理由を誰かが説明できれば幸いx(3.0)です。
ありがとう
編集:
を削除するz(3);と、意味:
- fun f(x) =
= let
= exception E of real;
= fun z(y)= raise E(y);
= in
= x(3.0)
=
= end;
val f = fn : (real -> 'a) -> 'a
- f(g);
出力は次のとおりです。
stdIn:11.1-11.5 Error: operator and operand don't agree [tycon mismatch]
operator domain: real -> 'Z
operand: int -> 'Y
in expression:
f g
-
したがって、ご覧のとおり、どちらの場合もエラーが発生します。
したがって、私は振り出しに戻ります: なぜ と の両方が次々にx(3.0)表示されるのにz(3)(コード 1、投稿の冒頭に投稿された最初のコードを参照)、なぜ SML は 2 行目のエラーのみを参照するのですか ( z(3);)最初の行が () を引き起こしたエラーではありませんx(3.0);。
再び10倍