2016-11-09 70 views
-3

我第一次嘗試編寫一個函數primeTest :: [Bool],它產生一個如果n爲素數的列表的第n個位置爲真,否則爲False。然後,我想調整函數以產生一個無限列表,使得第n個位置是一對(n; b),如果n是素數,則b的值爲True,否則爲False。primeTest函數Haskell

這是迄今爲止我嘗試:

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

試着寫一個函數'isPrime :: Int - > Bool',然後映射到像這樣的自然數:'map isPrime [0 ..]'。這可能不是非常有效(取決於你如何做),但這將是一個開始。 – jpath

+0

你的嘗試不起作用,因爲: 1.如果它能工作,它不會創建Bools列表,而只是一個Bool。 2.沒有常數(也不是函數)'素數'。你大概的意思是「這個數字是素數?」。但是什麼號碼?看看我上面的評論如何表達這一點。 – jpath

+0

jpath 我已經有一個主要功能,它的工作原理。 prime :: Integer - > Bool prime n = n> 1 &&和[not(divides x n)| x < - [2 ..(n-1)]] –

回答

1

我不知道你和你的prime功能做什麼。據我所知,沒有一個divides函數(至少在Prelude中)。我們先來解決它。對於相對質數ab

a `mod` b == 0 

而且質數n是所有數字相對黃金從2n-1。如果這種情況對於每個a-b對來說都是正確的,其中a是有問題的數字,並且b是從2n-1的每個數字,所以我們知道這個數字是總數。如果你願意的話,你實際上可以縮短這一點,但是我們會把它放在外面,因爲我們的目標不是效率。因此,我們重寫primes功能:

primes :: Integer -> Bool 
primes n = n > 1 && and [ prime n = n > 1 && and [ (n `mod` x) /= 0 | x <- [2..(n-1)] ] 

然後我們就可以map我們在無限的功能產生的Bools無限列表:

map primes [1..] 

,並檢查它是否工作正常,我們檢查列表中的特定索引:

ghci>> (map primes [1..]) !! 12 --expecting true, since 13 is prime 
True 

爲了使函數返回一個帶有w值的元組列表第i個布爾,我們可以用一個列表理解我們目前的功能:

primeTest :: [(Integer,Bool)] 
primeTest = [ (x,prime x) | x <- [1..] ] 

使用範例:

ghci>> primeTest !! 12 -- expecting (13,True) 
(13,True) 

在這一點上,因爲我認爲關閉的情況的一個指標使事情變得混亂,我倒是讓primeTest到像這樣的功能:

primeTest :: Int -> (Integer, Bool) 
primeTest n = [ (x,prime x) | x <- [1..] ] !! (n-1) 

因此,我們可以通過作爲參數傳遞我們要檢查的數量使用它:

ghci>> primeTest 13 
(13,True)