Haskell:阶乘函数有什么问题

时间:2016-04-10 09:22:19

标签: haskell

以下是我的阶乘函数:

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.

3 个答案:

答案 0 :(得分:4)

这是保守的ghc。您的代码具有&#34; n&#34;的所有可能值。但是ghc并不足以证明这一点,所以它会警告你。

尝试替换你的&#34; n&lt; 0&#34; &#34;否则&#34;并把它放在最后。这被定义为

otherwise = True

这将成为让ghc感到舒适的全能案例。

答案 1 :(得分:2)

编译器无法判断所有输入是否与三名警卫中的至少一名匹配。

这是一个建议,以解决这个问题,并删除一些重复:

media

答案 2 :(得分:1)

我认为编译器不够聪明,不知道涵盖这三种情况对于特定类型是详尽无遗的。只需在第三条规则中使用otherwise模式而不是零?

(顺便说一下,阶乘通常只定义为正整数,所以我不知道你的负分支是多少是正确的。)