为什么我会收到 "match redudant" 错误?
Why am i getting the "match redudant" error?
我对 运行 以下代码时遇到的 "match redundant" 错误感到有点困惑:
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 在您的代码中与此处一样冗余。
对于人类 reader 从缩进可以清楚地看出您希望案例 B 属于外部模式匹配,但是,正如我所说,编译器不关心缩进,所以您'您将需要使用括号或开始结束块来告诉编译器内部匹配结束的位置。
我对 运行 以下代码时遇到的 "match redundant" 错误感到有点困惑:
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 在您的代码中与此处一样冗余。
对于人类 reader 从缩进可以清楚地看出您希望案例 B 属于外部模式匹配,但是,正如我所说,编译器不关心缩进,所以您'您将需要使用括号或开始结束块来告诉编译器内部匹配结束的位置。