首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义数据类型的重叠模式匹配警告

自定义数据类型的重叠模式匹配警告
EN

Stack Overflow用户
提问于 2012-05-08 02:50:45
回答 1查看 253关注 0票数 1

我正在为一个类将几个程序从标准ML转换为Haskell,我对Haskell解析模式匹配的方式感到困惑。

我有这样的数据类型:

代码语言:javascript
复制
data Term = A | B
          | F Term | G Term | H Term Term
          | Var String
           deriving (Show)

这是我定义的函数的一部分:

代码语言:javascript
复制
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会给出以下输出:

代码语言:javascript
复制
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中是有效的,但在翻译过程中一定会遗漏一些东西。谢谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-08 03:04:05

我不确定nil是什么(在第一种模式中),但我假设您脑海中有一个空列表。如果是这样的话,用[]替换它就行了,模式匹配问题也就解决了。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10487411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档