我有一个名为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,有什么建议吗?谢谢。
答案 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)
您对allPrimes
和primeTest
的定义完全相同,因此如果allPrimes
是一个整数列表,那么primeTest
也是一个不应该感到惊讶整数列表,而不是您的类型签名声明的Bool列表。
primeTest
最简单的定义是:
primeTest :: [Bool]
primeTest = [ prime x | x<- [2..] ]
这与:
相同primeTest = map prime [2..]
这是你在找什么?