2011-12-17 6 views
4

私はHaskellでis_prime関数を定義しようとしています。誰でも関数を使用して問題を指摘できますか?Haskell 'any' function - primality check

さらに、私は以下のコードはナイーブであることを知っていますが、私はbabystepsから始めて言語を学んでいます。 any

is_prime 0 = False 
is_prime 1 = False 
is_prime 2 = True 
is_prime n = any [n `mod` k == 0 | k <- [2.. sqrt n]] 
+6

'' any''の使用に関する@ Janの修正を除けば、 '' any''から期待していたような機能は 'or'と呼ばれ、' sqrt'の使用あなたのチェックは間違っていて、 'not'が足りなくなっているので、合成数は' True'を返し、素数(2以外)は 'False'を返します。 –

+1

また、解はすべての除数のリストを作成し、そのリストがnullであるかどうかをチェックすると考えることもできます: 'null [k | k < - [2.sqrtn]、n \ 'mod \' k == 0] ' –

+0

良い質問です。この場合はエラーを見るのが難しくありませんでしたが、将来はエラーメッセージが含まれるはずですので、問題の内容を確認するのが簡単です。 – Boris

答えて

7

タイプは(a -> Bool) -> [a] -> Boolあるので、述語とコレクションを受け入れます。つまり、あなたのnが整数である一方、sqrtのタイプはFloating a => a -> aあるので

is_prime n = not $ any (\k -> n `mod` k /= 0) 
         [2 .. ceiling $ sqrt $ fromIntegral n] 

fromIntegralが必要であるインスタンスの場合と同様に、あなたの最後のケースを書き換える必要があります。その後、ceilingを使用しないと、anyの2番目の引数はFloating t => [t]になります。これは、タイプがIntegral a => a -> a -> aであるmodを非整数型に呼び出すと不正になります。

他の実装を探したい場合は、たとえばthis discussionをお勧めします。

0

is_prime関数が実際にFalseを返すと私の考えでは間違っていますが、nが素数である場合、ここにその理由があります。

  1. any function data戻るとすぐに、それはfunction dataTrueあることdataにおけるそのような要素に遭遇するようTrue
  2. \k -> mod n k /= 0が適用されない場合は、Trueが返されます。は一部の定数を除算しますn
  3. ので、any戻りTrueがある場合除算我々が素数かどうかを確認したい番号nFalseしないことを指定したリスト内の番号がある場合。
  4. ので、が明確素数ではないが、例えばリスト[2 .. ceiling $ sqrt $ fromIntegral n]に任意の数、4割り切れるあること任意の数のis_prime戻るTrue。言ったことで

、正しい解決策は次のようになります。それは 2とsqrt n間の任意の数の倍数ない場合は数nが素数であるので

is_prime n = not $ any (\k -> n `mod` k == 0) [2 .. ceiling $ sqrt $ fromIntegral n] 

です。