2014-12-11 2 views
1

Я учусь haskell. Я хочу знать, как иметь OR состояние в haskell list comprehensionsИЛИ состояние в списках Haskell List

В основном я хочу цифры, которые divisible by 3 or 5

Я попытался это

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

Но это только дает divisible by 5

+0

Параметр 'оператор OR' является' || '' –

+0

(||) :: Bool -> Bool -> Bool' и описывается как "Boolean 'или'". https://www.haskell.org/hoogle/?hoogle=Bool+-%3E+Bool+-%3E+Bool – Cirdec

+4

Project euler много? –

ответ

3

Путь вам написали ваше понимание, что у вас есть два предиката, и результат будет включать все элементы, которые удовлетворяют всем предикатам. Таким образом, ваша программа находит все числа, которые делятся на 3 и 3. Вместо

просто использовать оператор ИЛИ, как этот

[ 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

Comma (,) есть AND.

И одна труба | такова, что.

Prelude> [x | x <- [0..100], x `mod` 3 == 0, x `mod` 5 == 0] 
[0,15,30,45,60,75,90] 

Так что это говорит, дайте мне все х, что х находится в диапазоне [0..100] И делится на 3 и делится на 5. Это дает число, кратное как 3 и 5.

Сделайте это, чтобы получить то, что вы хотите

Prelude> [x | x <- [0..100], x `mod` 3 == 0 || x `mod` 5 == 0] 
Смежные вопросы