ML:警告:匹配非穷举

时间:2015-11-06 11:08:38

标签: sml ml

这就是问题:

我们使用以下类型表示多项式:

datatype exp = Const of int | x | Add of exp * exp | Mult of exp * exp | Power of exp * int

例如,表达式Add (Add (Mult (Const 3, Power (x, 2)), Mult (Const 6, x)), Const 1) 表示多项式3x2 + 6x + 1

(a)写一个函数"评估"评估特定值e的给定表达式x

这是我的答案:

datatype exp = Const of int | x | Add of exp * exp | Mult of exp * exp |Power of exp * int
fun pow(a,0) = 1 | pow(a,1) = a | pow(a,b) = mult(a,pow(a,b-1));
fun evaluate(Const(a),t) = a 
| evaluate(x,t) = t 
| evaluate(Add(a,x),t)= (evaluate(a,t)+t) 
| evaluate(Mult(a,x),t) = (evaluate(a,t)*t) 
| evaluate(Power(x,a),t) = pow(t,a);
val y = Add (Add (Mult (Const 3, Power (x, 2)), Mult (Const 6, x)), Const 1);
evaluate(y,1);

但结果是:

uncaught exception Match [nonexhaustive match failure]
raised at: stdIn:6.37

在定义函数evaluation之后,我有这个警告:

stdIn:1.6-6.37 Warning: match nonexhaustive
      (Const a,t) => ...
      (x,t) => ...
      (Add (a,x),t) => ...
      (Mult (a,x),t) => ...
      (Power (x,a),t) => ...
val evaluate = fn : exp * int -> int

我该怎么做才能解决它?

2 个答案:

答案 0 :(得分:0)

您收到警告,因为您的模式并未涵盖所有情况。例如 - Add模式应该看起来像Add(a,b),因为这涵盖了所有可能的情况。例如,

在表达式2x^3 + 3x^2中,a会绑定到2x^3b绑定到3x^2(当然,所有这些都适当地转换为您的数据类型)。但是 - 在您的evaluate中,您使用Add(a,x)这样的模式 - 这只会捕获看起来像2x^3 + x的多项式。我认为没有理由认为总和中的第二项是x。类似的评论适用于您的其他模式(x本身的第一个模式除外)。在所有情况下,请使用类似Add(a,x)的模式替换看起来像Add(a,b)的模式,并仔细考虑在这些情况下返回的内容。

答案 1 :(得分:0)

您只对包含x的字词进行匹配;你需要考虑任意exp并以递归方式评估所有这些。

例如,替换

evaluate(Add(a,x),t)= (evaluate(a,t)+t) 

evaluate (Add(e1, e2), t) = evaluate(e1, t) + evaluate(e2, t)