我正在学习 Haskell
。我想知道如何在 Haskell 列表理解
中使用 OR
条件。
基本上,我想要能够得到可被 3 或 5 整除的数
。
我尝试了以下代码:
[ x | x <- [0..1000], x `mod` 3 == 0 , x `mod` 5 == 0]
但这只是表明可被5整除
我正在学习 Haskell
。我想知道如何在 Haskell 列表理解
中使用 OR
条件。
基本上,我想要能够得到可被 3 或 5 整除的数
。
我尝试了以下代码:
[ x | x <- [0..1000], x `mod` 3 == 0 , x `mod` 5 == 0]
但这只是表明可被5整除
你写的理解方式意味着,你有两个谓词,并且结果将包括满足所有谓词的所有元素。因此,你的程序找到所有能被3和3整除的数字。相反,
只需使用OR运算符,像这样:
[ x | x <- [0..1000], x `mod` 3 == 0 || x `mod` 5 == 0]
获取所有可以被3或5整除的数字。注意,这个表述中只有一个谓词。
实际上它会给你所有既能被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]]
|
表示“如此”。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]
OR
运算符是||
。 - shree.pat18(||) :: Bool -> Bool -> Bool
被称为“布尔值的或”,它用于逻辑运算。详情请参考 https://www.haskell.org/hoogle/?hoogle=Bool+-%3E+Bool+-%3E+Bool - Cirdec