我第一次嘗試編寫一個函數primeTest :: [Bool]
,它產生一個如果n爲素數的列表的第n個位置爲真,否則爲False。然後,我想調整函數以產生一個無限列表,使得第n個位置是一對(n; b),如果n是素數,則b的值爲True,否則爲False。primeTest函數Haskell
這是迄今爲止我嘗試:
primeTest :: [Bool]
primeTest = if prime then True else False
我第一次嘗試編寫一個函數primeTest :: [Bool]
,它產生一個如果n爲素數的列表的第n個位置爲真,否則爲False。然後,我想調整函數以產生一個無限列表,使得第n個位置是一對(n; b),如果n是素數,則b的值爲True,否則爲False。primeTest函數Haskell
這是迄今爲止我嘗試:
primeTest :: [Bool]
primeTest = if prime then True else False
我不知道你和你的prime
功能做什麼。據我所知,沒有一個divides
函數(至少在Prelude中)。我們先來解決它。對於相對質數a
和b
:
a `mod` b == 0
而且質數n
是所有數字相對黃金從2
到n-1
。如果這種情況對於每個a-b
對來說都是正確的,其中a
是有問題的數字,並且b
是從2
到n-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)
試着寫一個函數'isPrime :: Int - > Bool',然後映射到像這樣的自然數:'map isPrime [0 ..]'。這可能不是非常有效(取決於你如何做),但這將是一個開始。 – jpath
你的嘗試不起作用,因爲: 1.如果它能工作,它不會創建Bools列表,而只是一個Bool。 2.沒有常數(也不是函數)'素數'。你大概的意思是「這個數字是素數?」。但是什麼號碼?看看我上面的評論如何表達這一點。 – jpath
jpath 我已經有一個主要功能,它的工作原理。 prime :: Integer - > Bool prime n = n> 1 &&和[not(divides x n)| x < - [2 ..(n-1)]] –