我第一次尝试编写一个函数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)]] –