以下是我的阶乘函数:
factorial :: Integer -> Integer
factorial n
| n < 0 = -1
| n > 0 = n * factorial (n-1)
| n == 0 = 1
我猜,我覆盖了所有情况(+ ve,-ve,0)。当我尝试加载上面的代码时,我收到以下警告。为什么我会收到警告?
Prelude> :load Fact.hs
[1 of 1] Compiling Main ( Fact.hs, interpreted )
Fact.hs:2:1: Warning:
Pattern match(es) are non-exhaustive
In an equation for ‘factorial’: Patterns not matched: _
Ok, modules loaded: Main.
答案 0 :(得分:4)
这是保守的ghc。您的代码具有&#34; n&#34;的所有可能值。但是ghc并不足以证明这一点,所以它会警告你。
尝试替换你的&#34; n&lt; 0&#34; &#34;否则&#34;并把它放在最后。这被定义为
otherwise = True
这将成为让ghc感到舒适的全能案例。
答案 1 :(得分:2)
编译器无法判断所有输入是否与三名警卫中的至少一名匹配。
这是一个建议,以解决这个问题,并删除一些重复:
media
答案 2 :(得分:1)
我认为编译器不够聪明,不知道涵盖这三种情况对于特定类型是详尽无遗的。只需在第三条规则中使用otherwise
模式而不是零?
(顺便说一下,阶乘通常只定义为正整数,所以我不知道你的负分支是多少是正确的。)