使用或在列表中理解

时间:2013-04-08 13:25:55

标签: haskell list-comprehension

我试图取出1到10之间的每个数字,可以被5或3整除 这是我的代码,直到现在 -

giveList = 
[ x
 | x <- [1..10] ,
 (x `mod` 5 == 0) or (x `mod` 3 == 0)
]

然后我在ghci中加载函数。但它给了我一个错误 -

> [1 of 1] Compiling Main             ( problem1.hs, interpreted )

problem1.hs:4:10:
    The function `x `mod` 5 == 0' is applied to two arguments,
    but its type `Bool' has none
    In the expression: (x `mod` 5 == 0) or (x `mod` 3 == 0)
    In a stmt of a list comprehension:
      (x `mod` 5 == 0) or (x `mod` 3 == 0)
    In the expression:
      [x | x <- [1 .. 10], (x `mod` 5 == 0) or (x `mod` 3 == 0)]
Failed, modules loaded: none.

我的问题是 -

  • 我们可以在列表推导中使用'或'吗?
  • 如果没有,请告诉我如何以其他方式完成

我是函数式编程的新手,请帮助我。

4 个答案:

答案 0 :(得分:13)

您可以在列表推导中使用or,但

Prelude> :t or
or :: [Bool] -> Bool

这不是你在那个地方需要的那个,它是一个检查列表中的任何元素是True的函数。你需要

(||) :: Bool -> Bool -> Bool

如果你想使用一个名称由字母中缀组成的函数,你需要将它包含在反引号中,就像你使用mod一样,但是因为or只需要一个参数,所以不能应用该函数中缀。

列表的正确版本为

giveList = [ x | x <- [1 .. 10], x `mod` 5 == 0 || x `mod` 3 == 0]

答案 1 :(得分:8)

or的类型签名为or :: [Bool] -> Bool。它需要布尔值的列表,如果其中任何一个为True,则返回True,否则返回False

您正在寻找的功能是|| :: Bool -> Bool -> Bool。它需要两个布尔值,如果其中任何一个为True,则返回True,否则返回False

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

答案 2 :(得分:2)

你可以这样做列表理解:

[x | x <- [1..10], ((x `mod` 3) == 0) || ((x `mod` 5) == 0)]

or功能适用于列表

答案 3 :(得分:0)

事实上,我在这里使用or可能并不是那么糟糕:

[x | x <- [1..10], or $ map ((==0).(x `mod`)) [3,5]]

......或者可能更具可读性......

[x | x <- [1..10], any (==0) $ map (x `mod`) [3,5]]

不利的一面是,它可能看起来有点可怕,但从好的方面来说,你可以轻松地测试更多的除数。