2012-05-07 29 views
1

クラスのために標準MLからHaskellにいくつかのプログラムを翻訳していますが、私はHaskellがこのパターンマッチングを解析する方法について混乱しています。カスタムデータ型でオーバーラップパターンマッチ警告

私は、このデータタイプがあります。

data Term = A | B 
      | F Term | G Term | H Term Term 
      | Var String 
      deriving (Show) 

をそして、これは私が定義しています機能の一部です:私は、モジュールをインポートするとき

unify :: [(Term, Term)] -> Bool 
-- argument represents a list of term equations, 
-- result indicates whether they have a solution 
unify nil = True 
unify ((A, A):eqns) = unify eqns 
unify ((B, B):eqns) = unify eqns 
unify ((F(t1), F(t2)):eqns) = unify((t1,t2):eqns) 
unify ((G(t1), G(t2)):eqns) = unify((t1,t2):eqns) 
unify ((H s1 t1, H s2 t2):eqns) = unify((s1,s2):(t1,t2):eqns) 
unify ((Var v1, t):eqns) = 
     (case t of 
       Var v2 -> if v1 == v2 then unify(eqns) 
          else unify(map (substEqn v1 t) eqns) 
      _  -> unify(map (substEqn v1 t) eqns)) 
unify ((t, Var v):eqns) = unify(map (substEqn v t) eqns) 
unify _ = False 

GHCiのは、私にこの出力を与える:

Warning: Pattern match(es) are overlapped 
      In an equation for `unify': 
       unify ((A, A) : eqns) = ... 
       unify ((B, B) : eqns) = ... 
       unify ((F (t1), F (t2)) : eqns) = ... 
       unify ((G (t1), G (t2)) : eqns) = ... 
       ... 

パターンマッチングの仕組みが分かりますが、なぜHaskellがこれらの4つの引数を考慮するのか理解できません同じもの。それらは異なるデータ型なので、等価なパターンではないはずですか?これはStandard MLで機能しましたが、何かが翻訳で失われていなければなりません。助けてくれてありがとう!

答えて

6

私はnilが(最初のパターンで)何であるか分かりませんが、空のリストがあると思います。そのような場合は、[]に置き換えてください。パターンマッチングの問題が解消されます。

+0

優秀、ありがとうございます!私はそれがちょっとした翻訳エラーだと思った。あなたが気づいていなかったならば、 'nil'は標準MLの空リストです。したがって混乱です。 – CMDadabo

+0

あなたはそうです。私はスタンダードMLで一見したことがありましたが、今あなたはそれを覚えています。 –

関連する問題