haskell中的素数程序

haskell中的素数程序,haskell,Haskell,我在Haskell中查找一个程序,该程序测试给定的数字是否为素数 prime :: (Integral a) => a -> Bool prime 1 = True prime x = and [ x `mod` y /= 0 | y <- [2..(x-1)] ] prime::(积分a)=>a->Bool 素数1=真 素数x=和[x`mod`y/=0 | y和对列表的所有元素执行逻辑与运算 素数只能被一和它自己整除;这意味着只要除数(不带余数)存在于包含2和您的xexcl

我在Haskell中查找一个程序,该程序测试给定的数字是否为素数

prime :: (Integral a) => a -> Bool
prime 1 = True
prime x = and [ x `mod` y /= 0 | y <- [2..(x-1)] ]
prime::(积分a)=>a->Bool
素数1=真

素数x=和[x`mod`y/=0 | y
对列表的所有元素执行逻辑与运算

素数只能被一和它自己整除;这意味着只要除数(不带余数)存在于包含2和您的
x
exclusive之间,该数字就不是素数

列表理解生成一个布尔值列表,对应于所述范围内的
x
是否可被数字整除

只要其中任何一个为假(余数为零的除法),该数字就不是素数

考虑:

x = 7
[7 % 2 /= 0 -> True, 7 % 3 /= -> True, ...]
-- now applying and
True && True && ... && True evaluates to True
可以表示为对列表执行的更一般的操作-使用逻辑and进行折叠。例如:
和'=foldr(&&&)True

表达式

[x `mod` y /= 0 | y <- [2..(x - 1)]

虽然这个问题已经得到了回答,但请允许我补充几点: 检查
的源代码时,您会得到:

and :: [Bool] -> Bool
and = foldr (&&) True
首先要注意的是,
获取布尔变量列表,并返回单个布尔变量,表达式
x mod y/=0
的计算结果为True或False(因此符合[Bool]要求)

更重要的是要注意的是,
foldr
是一个延迟折叠。因此这里的延迟折叠是最佳的,因为
&&
是一个半严格运算符。因此,延迟折叠与半严格运算符组合将在第一次遇到
False
时产生短路评估。因此,在实际非p雾凇编号、
将避免评估整个列表,从而节省您的时间。不要相信我的话,如果您愿意,请定义您自己的严格版本的
(使用更严格的
foldl
):

注意它有多快?现在执行此操作,但在它崩溃内存堆栈之前中断它:

primeStrict 2000000000

这显然比较慢,你可以打断它。这就是
的作用,这就是为什么
是用
foldr
编写的,也就是为什么选择它作为你发布的示例代码的原因。希望这能帮助你作为一个支持性的答案。

如果它执行逻辑and操作,它不应该是这样的:
&&
?@unsim并接受1个参数:布尔值列表;(&&&)接受2个参数:两个布尔值values@unexim同样,
和[a,b,c,d]
a&&b&&c&&d
相同,因此
不能命名为
&
。更准确地说,
和[a,b,c,d]==a&&b&&c&&d&&True
。但1不是质数。
andStrict :: [Bool] -> Bool
andStrict x = foldl (&&) True

primeStrict :: (Integral a) => a -> Bool
primeStrict x = andStrict [x `mod` y /= 0 | y <- [2..(x-1)]]
prime 2000000000
primeStrict 2000000000