2016-11-15 18 views
1

私は、次のコードを実行しているとき、私は取得しています「一致冗長」エラーについて少し混乱しています:正確なエラーのマッサージがある「マッチ・リダンダント」エラーが発生するのはなぜですか?

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 *) 
      ... 

+0

最後の2件は同一ではありませんか?私はSMLを知らないが、それはコンストラクタマッチングのように見え、最後の2行は 'Variable'と' Constant'sの両方を使う。 – Carcigenicate

+0

最後の2行は正確ですか?内側の「ケース」は、ul2に関してどちらのケースでも実質的に同じですが、ul1のケースの別の分岐を介してこのポイントに到達します。私は理解していないなぜ冗長性の問題を得る場合は、このようなケースネストしているので、それぞれの外部ケースは、それ自身の環境を持っていない必要がありますか?または、私はちょうど私の頭の中に間違って設定されていますか?その場合、この例の簡単な修正はありますか? – Amuoeba

答えて

1

は、以下のコードを検討してください。

このコードとコードの間の唯一の変更点は、ケースBのインデントを変更したことです。今度はインデントがSMLプログラムのセマンティクスに影響しないため、ケースBはコードと同じようにコード内に存在します。

人の読者には、あなたがケースBを外側のパターンマッチに属するように意図したことがインデントから明らかですが、私が言ったように、コンパイラはインデントを気にしないので、かっこまたは内側の一致が終了する場所をコンパイラに指示するためのbegin-endブロックを使用します。

+0

ああ、カッコは、ありがとうございます:) – Amuoeba

関連する問題