2016-11-09 22 views
-3

まず、nが素数の場合はリストのn番目の位置がTrueになるような関数primeTest :: [Bool]を作成しようとしています。それ以外の場合はFalseです。次に、n番目がpair(n; b)であるように無限リストを生成する関数を適合させたい。ここで、nがプライムであれば値bはTrue、そうでなければFalseである。私はあなたがあなたのprime機能でやっている正確に何か分からないprimeTest関数Haskell

primeTest :: [Bool] 
primeTest = if prime then True else False 
+4

'isPrime :: Int - > Bool'関数を書いて、それを次のような自然数にマップしてみてください:' map isPrime [0 ..] '。それはおそらく非常に効率的ではないでしょう(あなたのやり方によって異なります)が、それはスタートになります。 – jpath

+0

あなたの試行は、以下の理由で動作しません。 1.正常に動作する場合、Boolのリストは作成されず、Boolのリストは1つだけ作成されます。 2.定数はありません(そのための関数でもない) 'prime'です。あなたはおそらく "この数字はプライムですか?"のようなものを意味します。しかし何番?これを表現する方法については上記の私のコメントを見てください。 – jpath

+0

jpath 私はすでに素数関数を持っていて、動作します。 prime :: Integer - > Bool プライムn = n> 1 &&と[not(divides x n)| x < - [2 ..(n-1)]] –

答えて

1

はここで、これまで私の試みです。私が知る限り、少なくともプレリュードには divides関数はありません。それを修正して始めましょう。比較的素数 abについて:

a `mod` b == 0 

素数n2からn-1までのすべての数字と互いに素です。この条件がの各ペアについて真である場合、aが問題の番号であり、b2から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)