Haskell列表推导式中的OR条件

3

我正在学习 Haskell。我想知道如何在 Haskell 列表理解 中使用 OR 条件。

基本上,我想要能够得到可被 3 或 5 整除的数

我尝试了以下代码:

[ x | x <- [0..1000], x `mod` 3 == 0 , x `mod` 5 == 0]

但这只是表明可被5整除


OR 运算符是 || - shree.pat18
(||) :: Bool -> Bool -> Bool 被称为“布尔值的或”,它用于逻辑运算。详情请参考 https://www.haskell.org/hoogle/?hoogle=Bool+-%3E+Bool+-%3E+Bool - Cirdec
3个回答

4

你写的理解方式意味着,你有两个谓词,并且结果将包括满足所有谓词的所有元素。因此,你的程序找到所有能被3和3整除的数字。相反,

只需使用OR运算符,像这样:

[ x | x <- [0..1000], x `mod` 3 == 0 || x `mod` 5 == 0]

获取所有可以被3或5整除的数字。注意,这个表述中只有一个谓词。


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

1
逗号(,)表示“和”。单竖杠 | 表示“如此”。
Prelude> [x | x <- [0..100], x `mod` 3 == 0, x `mod` 5 == 0]
[0,15,30,45,60,75,90]

这段话的意思是给我所有在[0..100]范围内同时被3和5整除的x。这将会给你可以被3和5整除的数字。

按照以下步骤操作即可得到你想要的结果。

Prelude> [x | x <- [0..100], x `mod` 3 == 0 ||  x `mod` 5 == 0]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接