2012-05-07 55 views
1

我正在翻譯幾個程序從Standard 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認爲這四個參數s相同。它們是不同的數據類型,所以它們不應該是等效模式嗎?這在標準ML中有效,但翻譯中必須丟失一些東西。謝謝您的幫助!

回答

6

我不確定nil是什麼(在第一種模式中),但我認爲你有空列表。如果是這種情況,用[]代替它就可以解決問題,並且模式匹配問題也會消失。

+0

非常好,非常感謝!我認爲這是一些小的翻譯錯誤。如果您不知道,標準ML中的空列表,因此混淆。 – CMDadabo

+0

你是對的。我只在Standard ML看過一次,但現在你提到它了,我記得那次。 –