2015-11-06 49 views
0

这是一个问题: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); 

但结果是:

定义函数 evaluation后,我有这个警告
uncaught exception Match [nonexhaustive match failure] 
raised at: stdIn:6.37 

另外:

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 

我能要解决它吗?

回答

0

您只匹配包含x;您需要考虑任意exp s并递归评估它们的全部。

例如,更换

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

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

存在另一问题: 写功能“派生”根据 以下规则来计算多项式的导数: (U + V)'= u'+ v' (uv)'= u'v + uv' (un)'= n.un-1.u' 我写这个函数: fun derv(Const(a))= 0 | derv(x)= 1 | derv(Add(u,v))= derv(u)+ derv(v)| derv(Mult(u,v))=(derv(u)* v)+(u * derv(v))| derv(Power(u,n))= n * pow(u,n-1)* derv(u); 但它不工作。 有数据类型异常... – horotat

+0

翻译规则非常简单,但结果将是一个'exp'而不是一个数字 - 'derived x = Const 1'; '派生(Add(u,v)= Add(派生你,派生v)'等等。 – molbdnilo

0

您正在接受警告,因为您的模式未涵盖所有情况。例如 - Add模式应该看起来像Add(a,b),因为它涵盖了所有可能的情况。例如,

在表达式2x^3 + 3x^2a将结合2x^3b和向3x^2(所有适当地翻译成您当然数据类型)。但是 - 在您的evaluate中,您使用的模式如Add(a,x) - 只会捕获类似于2x^3 + x的多项式。我完全没有理由认为第二项是x。类似的评论适用于你的其他模式(除了x本身的第一个模式)。在所有情况下,请将看起来像Add(a,x)的图案替换为看起来像Add(a,b)的图案,并仔细考虑在这些情况下要返回的内容。