计算Haskell中的所有素数

时间:2014-03-11 21:39:15

标签: haskell

我试图在Haskell中创建一个计算所有素数的函数,但它似乎不起作用。 这就是我的代码的样子:

import Data.Char
countPrimeNumbers :: [Int] -> Int
countPrimeNumbers n = all (isDigit) n

任何人都有解决方案吗?谢谢!

3 个答案:

答案 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..]