首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Haskell模式匹配中暗示相等

在Haskell模式匹配中暗示相等
EN

Stack Overflow用户
提问于 2012-08-23 04:08:11
回答 3查看 4K关注 0票数 12

我正在编写一个函数来简化布尔表达式。例如,Nand(A, A) == Not(A)。我尝试使用模式匹配来实现这个特定规则,如下所示:

代码语言:javascript
运行
复制
-- Operands equivalent - simplify!
simplify (Nand q q) = Not (simplify q)
-- Operands must be different, so recurse.
simplify (Nand q q') = Nand (simplify q) (simplify q')

编译时,我得到以下错误:

代码语言:javascript
运行
复制
Conflicting definitions for `q'
Bound at: boolean.hs:73:21
          boolean:73:29
In an equation for `simplify'

我想我明白这是怎么回事,我一直在努力,但我只想知道:

  1. 为什么这种模式匹配是不可能的?
  2. 有什么惯用的解决办法吗?

完全披露:这与家庭作业有关,但这门课程的目的不是为了学习Haskell,我已经用自己的方式解决了这个问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-29 21:38:05

你可以坚持你原来的风格:

代码语言:javascript
运行
复制
-- Operands equivalent - simplify!
simplify (Nand q q') | q == q' = Not (simplify q)
-- Operands must be different, so recurse.
simplify (Nand q q') = Nand (simplify q) (simplify q')

此外,我认为您应该在等式测试之前而不是之后简化:

代码语言:javascript
运行
复制
simplify (Nand q q') = if qs == qs' then Not qs else Nand qs qs' where
    qs = simplify q
    qs' = simplify q'
票数 2
EN

Stack Overflow用户

发布于 2012-08-23 04:08:11

我找到的解决方案是使用警卫检查子结构是否相等:

代码语言:javascript
运行
复制
simplify (Nand q q')
    -- Operands equivalent - simplify!
    | q == q' = Not (simplify q)
    -- Operands different - recurse.
    | otherwise = Nand (simplify q) (simplify q')
票数 16
EN

Stack Overflow用户

发布于 2012-08-23 10:20:06

“答案”是,在一个模式中,您不允许两次提到同一个变量。反正在哈斯克尔也不行。解决这一问题的最佳方法是你似乎已经发现的方法--使用模式保护来测试平等或不平等。

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

https://stackoverflow.com/questions/12084593

复制
相关文章

相似问题

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