这就是问题:
我们使用以下类型表示多项式:
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
我该怎么做才能解决它?
答案 0 :(得分:0)
您收到警告,因为您的模式并未涵盖所有情况。例如 - Add
模式应该看起来像Add(a,b)
,因为这涵盖了所有可能的情况。例如,
在表达式2x^3 + 3x^2
中,a
会绑定到2x^3
和b
绑定到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)