我正在学习haskell
。我想知道OR
haskell list comprehensions
条件
基本上我想要divisible by 3 or 5
我试过这个
[ x | x <- [0..1000], x `mod` 3 == 0 , x `mod` 5 == 0]
但这只是给divisible by 5
答案 0 :(得分:3)
您编写理解的方式意味着,您有两个谓词,结果将包括满足所有谓词的所有元素。所以,你的程序找到所有可以被3和3整除的数字。而不是
只需使用OR运算符,就像这样
[ x | x <- [0..1000], x `mod` 3 == 0 || x `mod` 5 == 0]
获取所有可以被3或5整除的数字。注意我们在这个理解中只有一个谓词。
答案 1 :(得分:3)
实际上它会给你所有可以被5和3整除的数字。这背后的原因是,
相当于&&
所以:
[x | x <- range, a, .., c]
相当于:
[x | x <- range, a && ... && c]
然而,您可以在每个逗号分隔部分中具有任何条件;包括但不限于:
-- Logic OR
or :: [Bool] -> Bool
|| :: Bool -> Bool -> Bool
any :: (a -> Bool) -> [a] -> Bool
-- Logic AND
and :: [Bool] -> Bool
&& :: Bool -> Bool -> Bool
all :: (a -> Bool) -> [a] -> Bool
例如,在您的情况下,您可以使用:
divisibleBy :: Integral a => a -> a -> Bool
divisibleBy x y = (x `mod` y) == 0
然后:
[x | x <- [0..1000], x `divisibleBy` 3 || x `divisibleBy` 5]
或者你可以简单地使用:
[x | x <- [0..100], any ((== 0) . (x `mod`)) [3, 5]]
答案 2 :(得分:1)
逗号(,)是AND。
单管|
就是这样的。
Prelude> [x | x <- [0..100], x `mod` 3 == 0, x `mod` 5 == 0]
[0,15,30,45,60,75,90]
所以这就是说给我所有的x,使得x在[0..100]范围内并且可以被3整除并且可以被5整除。这使得你可以被3和5整除的数字。
这样做是为了得到你想要的东西
Prelude> [x | x <- [0..100], x `mod` 3 == 0 || x `mod` 5 == 0]