На самом деле это дает вам все числа, которые и делятся на 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]]
Параметр 'оператор OR' является' || '' –
(||) :: Bool -> Bool -> Bool' и описывается как "Boolean 'или'". https://www.haskell.org/hoogle/?hoogle=Bool+-%3E+Bool+-%3E+Bool – Cirdec
Project euler много? –