在Haskell List中理解OR条件

时间:2014-12-11 06:17:12

标签: haskell list-comprehension

我正在学习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

3 个答案:

答案 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]