【问题标题】:Non-exhaustive pattern matching非穷举模式匹配
【发布时间】:2013-11-26 18:42:55
【问题描述】:

我正在从事一个适用于模块化算术的项目。 我在调用该函数时遇到了模式匹配问题。 这是 Modular 类型的构造函数。 madd 需要两个 Modular 类型的实例,并假设将它们相加返回 Modular 类型。

data Modular = Mod Integer Integer deriving Show
instance (Eq Modular) where
  (Mod a1 m1) == (Mod a2 m2) = m1==m2 && mod (a1-a2) m1 == 0


-- Adds two modular numbers of the same modulus
madd :: Modular -> Modular -> Modular
madd (Mod a1 m1) (Mod a2 m2) | m1 == m2 = Mod (mod (a1+a2) m1) m1

谁能帮助我,为什么我会得到非详尽的模式匹配? 错误是这样的:

Warning: Pattern match(es) are non-exhaustive
         In an equation for `madd':
             Patterns not matched: (Mod _ _) (Mod _ _)

顺便说一句,我在 Eclipse IDE 中使用了 haskell 插件。

【问题讨论】:

  • 如果m1 /= m2会发生什么?
  • tom,将其发布为答案,以便 mehdix_ 可以关闭问题:-)
  • @tom,你能解释一下吗?你上面提到的情况会发生什么?
  • @mehdix_ 如果m1 /= m2(例如madd (Mod 1 4) (Mod 2 5))由于模式匹配失败会出现运行时错误,因为m1 == m2 为假。

标签: haskell


【解决方案1】:

为了快速修复,您可以随时添加自己的错误报告:

madd (Mod a1 m1) (Mod a2 m2) | m1 == m2 = Mod (mod (a1+a2) m1) m1
madd (Mod a1 m1) (Mod a2 m2) = 
                  error ("You can not add  a mod " ++ show m1 
                             ++ " number with a " show m2 ++ " number.")

这不仅消除了警告,而且还可以在案例被调用时为您提供更多信息。当然,如果它被触发,程序会崩溃(就像没有额外的情况一样)......如果我想向最终用户传达错误,我会放一些不那么苛刻的东西。

【讨论】:

  • 或者直接使用| otherwise = ...
【解决方案2】:

这是警告而不是错误。编译器不够聪明,无法检查保护语句以确保它们涵盖所有可能的匹配,因此它从详尽的模式检查中排除了带有保护的模式匹配。如果您没有匹配所有可能输入的模式而没有保护,您将不得不忍受它,or disable it

【讨论】:

  • 在这种情况下并不完全正确。确实有一个案子不见了。即m1 /= m2.的情况
【解决方案3】:

“模式匹配并非详尽无遗”

madd :: Modular -> Modular -> Modular
madd (Mod a1 m1) (Mod a2 m2) | m1 == m2 = Mod (mod (a1+a2) m1) m1
                           **| otherwise = ...** you have to write the answer to this case

【讨论】:

    猜你喜欢
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多