我试图在Haskell中创建一个计算所有素数的函数,但它似乎不起作用。 这就是我的代码的样子:
import Data.Char
countPrimeNumbers :: [Int] -> Int
countPrimeNumbers n = all (isDigit) n
任何人都有解决方案吗?谢谢!
答案 0 :(得分:4)
你想要的是
countPrimes :: [Int] -> Int
countPrimes ns = length $ filter isPrime ns
但你必须自己提出isPrime
all
函数的类型为
all :: (a -> Bool) -> [a] -> Bool
它的作用是对列表中的每个元素应用测试,然后对所有元素进行逻辑AND。如果您想测试列表中的所有元素是否为素数,您可以将其用作
allPrime :: [Int] -> Bool
allPrime ns = all isPrime ns
,其中
isPrime :: Int -> Bool
isPrime n = undefined -- Test if its a prime here
相反,filter
函数采用相同类型的谓词,但只返回传递谓词的值,例如:
> :type even
Int -> Bool
> even 1
False
> even 2
True
> filter even [1..10]
[2, 4, 6, 8, 10]
所以filter isPrime ns
应该返回ns
中所有素数的数字,然后你只需用length
计算它们。
答案 1 :(得分:1)
这是一个简短的Haskell函数,它枚举了Literate Programs中的素数:
primes :: [Integer]
primes = sieve [2..]
where
sieve (p:xs) = p : sieve [x|x <- xs, x `mod` p > 0]
显然,这不是Eratosthenes的筛子(感谢Landei)。我认为它仍然是一个有启发性的例子,表明你可以在Haskell中编写非常优雅的短代码,并显示错误数据结构的选择如何严重损害效率。
答案 2 :(得分:0)
这将为您提供素数列表(import Data.List)
nubBy (\x y -> x `mod` y == 0) [2..]