次のコードを考えると:
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)
g
int
g
3.0
g
real
実行時にエラーが発生しない理由を誰かが説明できれば幸い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倍