2013-11-24 52 views
1

我对上模运算工作的项目。 我在调用函数时遇到了模式匹配问题。 这里是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插件。

+4

如果'm1/= m2'会出现什么情况? – tom

+0

汤姆的职位,作为一个答案,让mehdix_可以关闭问题:-) – kaan

+0

@汤姆,你能解释一下吗?你在上面提到的情况会发生什么? –

回答

1

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

+3

这种情况并不完全正确。真的有一个案件失踪。即,'m1/= m2'的情况。 –

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

这不仅摆脱了警告,但它也可以用来给你更多的信息,如果该情况调用。当然,如果它被触发时,程序会崩溃(因为它会没有额外的情况下)......如果我想要一个错误传达给最终用户,我会把在不太恶劣的东西。

+3

或者只使用'|否则= ...'。 –

0

“模式匹配(es)are not-exhaustive“

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