2016-11-09 128 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)