2016-04-10 7 views
2

私の階乗関数され、以下の階乗関数と間違っているもの:ハスケル:

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. 

答えて

1

コンパイラは、3つのケースをカバーすることが特定のタイプを網羅していることを知るには十分スマートではないと思います。 0の代わりに第3のルールでotherwiseパターンを使用するだけですか?

(ところで、階乗は通常、正の整数のみのために定義されているので、私はあなたの負の分岐は正しいですどのくらい知っていません。)

4

これは保守的GHCです。あなたのコードには "n"の値がすべて含まれていますが、ghcはそれを証明するほどスマートではないので警告します。

「n < 0」を「それ以外」に置き換えて最後に置きます。これは、

otherwise = True 

と定義されています。これはghcを快適にするキャッチオールケースになります。

+0

ケースを '追加、と言うことです。ここでは

はそれを修正し、また、いくつかの繰り返しを削除する提案ですそうでなければ=エラー "不可能なことが起きました。" – AJFarmar

+0

私はポールが合法的なケースの1つをキャッチオールケースで扱うことを意味すると思います。私は[できるだけ「エラー」から離れる](http://programmers.stackexchange.com/questions/252977/cleanest-way-to-report-errors-in-haskell)。 – zoul

2

コンパイラは、すべての入力が少なくとも3人のガードのうちの1つと一致しているとは判断できません。 |

factorial :: Integer -> Integer 
factorial n = case compare n 0 of 
    LT -> -1 
    GT -> n * factorial (n-1) 
    EQ -> 1