這是一個問題: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