私は、次のコードを実行しているとき、私は取得しています「一致冗長」エラーについて少し混乱しています:正確なエラーのマッサージがある「マッチ・リダンダント」エラーが発生するのはなぜですか?
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)) => ...
私は非網羅的な試合についての心をいけませんそれは単なる運動ですから。 事前にお手数をおかけしていただきありがとうございます。 (変数名を除く)ケースAと同じであるので、ケースBが冗長であることがかなり明確であるべきである
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 *)
...
:
最後の2件は同一ではありませんか?私はSMLを知らないが、それはコンストラクタマッチングのように見え、最後の2行は 'Variable'と' Constant'sの両方を使う。 – Carcigenicate
最後の2行は正確ですか?内側の「ケース」は、ul2に関してどちらのケースでも実質的に同じですが、ul1のケースの別の分岐を介してこのポイントに到達します。私は理解していないなぜ冗長性の問題を得る場合は、このようなケースネストしているので、それぞれの外部ケースは、それ自身の環境を持っていない必要がありますか?または、私はちょうど私の頭の中に間違って設定されていますか?その場合、この例の簡単な修正はありますか? – Amuoeba