这是一个问题: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
我能要解决它吗?
存在另一问题: 写功能“派生”根据 以下规则来计算多项式的导数: (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
翻译规则非常简单,但结果将是一个'exp'而不是一个数字 - 'derived x = Const 1'; '派生(Add(u,v)= Add(派生你,派生v)'等等。 – molbdnilo