给定以下代码:
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
throwsint
而不是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
-
所以,正如 U 所见,在这两种情况下我们都会得到错误。
因此,我回到第一方:为什么当两者都x(3.0)
出现时z(3)
(参见代码1,帖子开头发布的第一个代码),为什么SML只提到第二行(z(3);
)的错误引起的,而不是第一行引起的错误 ( x(3.0);
)。
再次 10 倍