Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sml ML:警告:匹配非穷举_Sml_Ml - Fatal编程技术网

Sml ML:警告:匹配非穷举

Sml ML:警告:匹配非穷举,sml,ml,Sml,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) 编写一个函数“evaluate”来计算给定表达式e的特定值x 我的回答是: datatype exp = C

问题是:

我们使用以下类型表示多项式:

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) 编写一个函数“evaluate”来计算给定表达式
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
同样在定义函数
评估后
出现以下警告:

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

我能做些什么来修复它呢?

您会收到警告,因为您的模式并没有涵盖所有情况。例如--and
Add
模式应该类似于
Add(a,b)
,因为这涵盖了所有可能的情况。比如说,


在表达式
2x^3+3x^2
中,
a
将绑定到
2x^3
,而
b
将绑定到
3x^2
(当然,所有这些都可以适当地转换为您的数据类型)。但是--在您的
计算中
使用了类似于
添加(a,x)
的模式--这将只捕获类似于
2x^3+x
的多项式。我认为绝对没有理由假设总和中的第二项是
x
。类似的注释适用于其他模式(除了
x
本身的第一个模式)。在所有情况下,将看起来像
Add(a,x)
的模式替换为看起来像
Add(a,b)
的模式,并仔细考虑在这些情况下返回的内容。

您只匹配包含
x
的条款;您需要考虑任意的
exp
s并递归地计算它们

例如,替换

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


还有一个问题:写一个函数“派生”来根据以下规则计算多项式表达式的导数:c'=0x'=1(u+v)=u'+v'(u.v)=u.v+u.v'(un)=n.un-1.u'我写这个函数:fun derv(Const(a))=0|derv(x)=1|derv(Add(u,v))=derv(u)+derv(u)+derv(v)| derv(Mult(u,v))=(derv)*(uderv(v))|derv(Power(u,n))=npow(u,n-1)*derv(u);但它不起作用。存在数据类型异常…转换规则非常简单,但结果将是一个exp而不是一个数字-
派生x=Const 1
派生(添加(u,v)=Add(派生u,派生v)
,等等。
evaluate (Add(e1, e2), t) = evaluate(e1, t) + evaluate(e2, t)