2017-11-17 21 views
0

ハスケルでの無限素数のリストからなる単純なリストの理解を書いてみたいと思います。ハスケルでのリストの理解

私の試み:

isPrime 1 = False 
isPrime x = and [x `mod` z /= 0 | z <- [1..x-1]] 

primes = [x | x <-[1..], isPrime x ] 

しかし、私はそれが立ち往生take 10 primesとして、コンソール上でこれを実行してみてください!どうした?

答えて

4

問題は、あなたのisPrime機能である:

isPrime x = and [x `mod` z /= 0 | z <- [1..x-1]] 

あなたは1からX-1に、各要素を取り、残りはゼロに等しくないかどうかを確認します。いずれかの値がゼロに等しい場合、isPrimeはfalseを返します。

しかし、リストの理解は1つで始まります。リストの理解度は、すべての数字がで割り切れます。

だから、代わりに2つで始めてください。

isPrime x = and [x `mod` z /= 0 | z <- [2..x-1]] 

これは期待どおりに動作します。

λ> take 10 primes 
[2,3,5,7,11,13,17,19,23,29] 

大きな機能で問題が発生した場合は、それを分解して個々の部分を実行して、結果が期待どおりであることを確認してください。この場合、isPrime 2 == Falseはどこに問題があるかを示します。