非穷举模式匹配

时间:2013-11-24 00:06:33

标签: haskell

我正在开发一个适用于Modular Arithmetic的项目。 我在调用函数时遇到了模式匹配问题。 这是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 _ _)

BTW,我在eclipse IDE中使用haskell插件。

3 个答案:

答案 0 :(得分:2)

要快速解决问题,您可以随时添加自己的错误报告:

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.")

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

“模式匹配是非详尽的”

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