2015-11-06 61 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)的圖案,並仔細考慮在這些情況下要返回的內容。