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 つの引数を同一と見なす理由がわかりません。それらは異なるデータ型なので、同等のパターンではありませんか? これは標準 ML では機能しましたが、翻訳で何かが失われているに違いありません。助けてくれてありがとう!

4

1 に答える 1

6

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

于 2012-05-07T19:04:04.950 に答える