我试图取出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.
我的问题是 -
我是函数式编程的新手,请帮助我。
答案 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]]
不利的一面是,它可能看起来有点可怕,但从好的方面来说,你可以轻松地测试更多的除数。