Sml 为什么我会得到“一个”;“匹配冗余数据”;错误?
我对运行以下代码时出现的“匹配冗余”错误感到有点困惑:Sml 为什么我会得到“一个”;“匹配冗余数据”;错误?,sml,Sml,我对运行以下代码时出现的“匹配冗余”错误感到有点困惑: datatype expression = Constant of int | Variable of string | Operator of string * expression | Pair of expression list | List of expression list fun add2 (ul1: expressi
datatype expression = Constant of int |
Variable of string |
Operator of string * expression |
Pair of expression list |
List of expression list
fun add2 (ul1: expression, ul2: expression) =
let
fun gcd (a, b) =
if a >= b
then
if (a mod b) = 0
then b
else gcd (b,(a mod b))
else
if (b mod a) = 0
then a
else gcd (a, (b mod a))
fun lcm (a,b) =
a*b div (gcd(a,b))
in
case ul1 of
Operator("/",Pair [Constant a, Constant b]) =>
case ul2 of
Operator("/",Pair [Constant c, Constant d]) =>
a*d + c*b//(b*d)
|Operator("/",Pair [Variable c, Constant d])=>
Operator("/",Pair [(Operator("+", Pair [Constant a, Variable c])),Constant (lcm(b,d))])
|Operator("/",Pair [Variable a, Constant b]) =>
case ul2 of
Operator("/",Pair [Constant c, Constant d]) =>
Operator("/",Pair [(Operator("+", Pair [Variable a, Constant c])),Constant (lcm(b,d))])
|Operator("/",Pair [Variable c, Constant d])=>
Operator("/",Pair [(Operator("+", Pair [Variable a, Variable c])),Constant (lcm(b,d))])
end
确切的错误是:
C:\Users\erikj\Dropbox\Fakulteta Laptop\Programiranje\domacanaloga 6.sml:91.5-102.93 Error: match redundant and nonexhaustive
Operator ("/",Pair (Constant c :: Constant d :: nil)) => ...
Operator ("/",Pair (Variable c :: Constant d :: nil)) => ...
--> Operator ("/",Pair (Variable a :: Constant b :: nil)) => ...
我不介意非消耗性的比赛,因为这只是一种锻炼。
提前感谢您的帮助 考虑以下代码:
case ul1 of
Operator("/",Pair [Constant a, Constant b]) =>
case ul2 of
Operator("/",Pair [Constant c, Constant d]) =>
...
|Operator("/",Pair [Variable c, Constant d])=> (* Case A *)
...
|Operator("/",Pair [Variable a, Constant b]) => (* Case B *)
...
很明显,案例B是冗余的,因为它与案例A相同(变量名除外)
这段代码和您的代码之间唯一的变化是我更改了案例B的缩进。现在缩进不会影响SML程序的语义,因此案例B在您的代码中就像在这里一样冗余
对于人类读者来说,从缩进中可以清楚地看出,您希望案例B属于外部模式匹配,但正如我所说,编译器并不关心缩进,因此您需要使用括号或开始-结束块来告诉编译器内部匹配的结束位置。最后两个案例是否相同?我不知道SML,但它看起来像是构造函数匹配,最后两行同时使用
变量
和常量
s。你到底指的是哪两行?关于ul2,在这两种情况下,内部“case”实际上是相同的,但是您可以通过ul1的case的不同分支来达到这一点。我不明白,既然每一个外壳都应该有自己的环境,如果你有这样的外壳嵌套,为什么会出现冗余问题?还是我只是在脑子里把事情搞错了。在这种情况下,这个例子有没有简单的解决方法?