haskell中的素数程序
我在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
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