:
はここで、これまで私の試みです。私が知る限り、少なくともプレリュードには
divides
関数はありません。それを修正して始めましょう。比較的素数
a
と
b
について:
a `mod` b == 0
素数n
2
からn-1
までのすべての数字と互いに素です。この条件がの各ペアについて真である場合、a
が問題の番号であり、b
が2
からn-1
までの各数値である場合、その数は素数であることがわかります。あなたが望むなら実際にこれを短縮することができますが、私たちの目標は効率ではないので、私はそれを残しておきます。我々は、
map primes [1..]
そして期待通りに働いているかどうかを確認するために:私たちは、その後map
が無限超える私たちの機能がBools
の無限のリストを生成することができます
primes :: Integer -> Bool
primes n = n > 1 && and [ prime n = n > 1 && and [ (n `mod` x) /= 0 | x <- [2..(n-1)] ]
:したがって、我々はprimes
機能を書き換えますリスト内の特定のインデックスを確認してください:
ghci>> (map primes [1..]) !! 12 --expecting true, since 13 is prime
True
値をwとしたタプルのリストを返すように関数を適合させるには私はオフずつインデックスは物事が混乱になると思うので、私は、
ghci>> primeTest !! 12 -- expecting (13,True)
(13,True)
この時点で:
primeTest :: [(Integer,Bool)]
primeTest = [ (x,prime x) | x <- [1..] ]
使用例:BOOL i番目、我々はリスト内包と私たちの現在の機能を使用することができます
:だから私たちは、引数として渡すことで、我々がチェックしたい番号を使用することができます
primeTest :: Int -> (Integer, Bool)
primeTest n = [ (x,prime x) | x <- [1..] ] !! (n-1)
:「そうのような関数にprimeTest
を作るdは
ghci>> primeTest 13
(13,True)
'isPrime :: Int - > Bool'関数を書いて、それを次のような自然数にマップしてみてください:' map isPrime [0 ..] '。それはおそらく非常に効率的ではないでしょう(あなたのやり方によって異なります)が、それはスタートになります。 – jpath
あなたの試行は、以下の理由で動作しません。 1.正常に動作する場合、Boolのリストは作成されず、Boolのリストは1つだけ作成されます。 2.定数はありません(そのための関数でもない) 'prime'です。あなたはおそらく "この数字はプライムですか?"のようなものを意味します。しかし何番?これを表現する方法については上記の私のコメントを見てください。 – jpath
jpath 私はすでに素数関数を持っていて、動作します。 prime :: Integer - > Bool プライムn = n> 1 &&と[not(divides x n)| x < - [2 ..(n-1)]] –