如果数字是素数,创建一个输出true或false的函数?

时间:2015-11-07 18:35:57

标签: haskell

我有一个名为primeTest的函数,它应该为每个n元素输出True或false为无穷大,无论它是否为素数。

divides :: Integer -> Integer -> Bool 
divides x y = y `mod` x == 0

prime :: Integer -> Bool
prime n = n > 1 && and [not(divides x n) | x <- [2..(n-1)]]

allprimes :: [Integer]
allprimes = [x | x<- [2..], prime x]


primeTest :: [Bool]
primeTest = [x | x<- [2..], prime x]

我试过调用all primes函数但得到的错误是它不能匹配类型Integer到Bool,有什么建议吗?谢谢。

2 个答案:

答案 0 :(得分:2)

primeTest函数的定义与allprimes函数的定义相同;这两个定义都有[Integer]类型,所以当然这会发生冲突,因为你刚刚告诉它你会提供[Bool]

可能你打算做的不是生成元素列表,使得该元素是素数,而是为每个元素生成,无论该元素是否为素数。想一想:

[             | x <- [2..],            ]
  ^                          ^ condition on whether to include it in the list
  what to include in the final list

答案 1 :(得分:0)

您对allPrimesprimeTest的定义完全相同,因此如果allPrimes是一个整数列表,那么primeTest也是一个不应该感到惊讶整数列表,而不是您的类型签名声明的Bool列表。

primeTest最简单的定义是:

primeTest :: [Bool]
primeTest = [ prime x | x<- [2..] ]

这与:

相同
primeTest = map prime [2..]

这是你在找什么?