SML解释器.我的Div函数正在工作,但我的Minus函数有问题.当传递的错误不是数字时,我希望它给出一个错误


datatype exp = Int of int | Minus of exp * exp | Div of exp * exp;

datatype value = CVal of int 
| FnVal of string * exp * (string * value) list 
| Error of string;
fun eval (Int x) _ = CVal x 
| eval (Div (e1, e2)) ctx = let val (CVal x) = eval e1 ctx
val (CVal y) = eval e2 ctx
in if y = 0
then Error "Division by zero error"
else CVal (x div y)
end
| eval (Minus (e1, e2)) ctx = let val (CVal x) = eval e1 ctx
val (CVal y) = eval e2 ctx
in if x <> Int orelse y <> Int
then Error "Minus error : not an integer"
else CVal (x - y)
end;

Int不是一个值,它是一个构造函数。你无法将它与任何东西相比
它也是exp值的构造函数,而不是整数的构造函数。

如果你看看你的定义,

datatype value = CVal of int 
...

很明显,xy必须是整数,就像除法的情况一样
如果您想检查类型,您也需要对除法执行此操作,并且您需要在
CVal xCVal y匹配之前执行

如果你尝试在一个函数中完成所有操作,这会变得非常混乱,所以我会写一些评估辅助函数;像这样的东西:

fun divide (CVal _) (CVal 0) = Error "Division by zero"
| divide (CVal x) (CVal y) = CVal (x div y)
| divide _ _ = Error "Division error: not an integer";
fun subtract (CVal x) (CVal y) = CVal (x - y)
| subtract _ _ = Error "Subtraction error: not an integer";
fun eval (Int x) _ = CVal x 
| eval (Div (e1, e2)) ctx = let val x = eval e1 ctx
val y = eval e2 ctx
in
divide x y
end
| eval (Minus (e1, e2)) ctx = let val x = eval e1 ctx
val y = eval e2 ctx
in
subtract x y
end;

最新更新