我正在将一些程序从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认为这四个参数是相同的。它们是不同的数据类型,所以它们不应该是等效的模式吗?这在标准ML中起作用,但在翻译中必须丢失一些东西。谢谢你的帮助!
答案 0 :(得分:6)
我不确定nil
是什么(在第一种模式中),但我认为你有空列表。如果是这种情况,将其替换为[]
就行了,你的模式匹配问题就会消失。