2017-12-17 14 views
0

私はHaskellを勉強しようとしていますが、私は階乗を計算するために以下の単純な再帰関数を定義しました。機能が小数に適用されているときに、負の数に指定されたエラーが表示されます。どうして?

fact n | n < 0 = error "fact only valid for non-negative integers" 
     | n == 0 = 1 
     | n > 0 = n * fact(n-1) 

それは、正の整数のために正常に動作し、負の整数で呼び出されたときに予想されるように、それは私が指定したエラーをスローします。

問題が何ですか?:それは私に同じエラー(「事実は負でない整数に対してのみ有効です」)を、分数に適用しようとすると、fact 10.5のようになります。なぜ私は、明示的に指定したのと同じエラーが、nの場合にのみ適用されるべきであることを意味します。

答えて

5

引数として10.5を指定すると、3番目のケースが有効になり、関数は再帰的にn = 10.5 - 1 = 9.5

この入力でも3番目のケースがトリガーされ、n = 8.5で再帰呼び出しが行われます。

そしてそうで:次に次いで7.5、6.5、5.5、4.5、3.5、2.5、1.5、0.5

そして、最初のケースをトリガし、エラーを生成し、次の反復、n = -0.5、オン。すべてが正確にコード化されています。

ファンクションを小数として機能させるには、(a)の階級を何であるかを定義し、(b)その場合をエンコードする必要があります。例えば

、私はその後、関数は次のようになり、1に等しくなるように0と1の間の数値の階乗を定義した場合:

fact n | n < 0 = error "fact only valid for non-negative integers" 
     | n >= 0 && n <= 1 = 1 
     | n > 0 = n * fact(n-1) 

また、サイドノートを:私は思います上記のコードでは、関数が部分的であるという警告が表示されます。これは、コンパイラがケースの1つが常に保持されるべきであることを証明することができないためです(引数タイプとそれに応じてNumおよびOrdの定義に応じて公平にすべて公平に保持する必要があります)。これを避けるには、otherwise句を使用する必要があります。

+0

ありがとうございました!それは当然のことです。私はこれを考え出したはずです。私がそうすることができるとき、答えを受け入れるだろう。 – Curious2learn

関連する問題