如果list只有foldr的偶数,则返回true

时间:2012-12-07 14:43:57

标签: list haskell

我想要一个检查列表是否只包含偶数的函数;如果是,则应返回True,否则返回False

我想使用的功能是map / filter / foldr,可能没有length

这是我的尝试:

ListOfeven :: [Integral] -> Bool
ListOfeven xs = 
  | foldr (+) True filter odd xs < 0 = True
  | otherwise = False

我很确定有一种更清洁的方式..不存在吗? :)

3 个答案:

答案 0 :(得分:7)

最简单的方法是使用Prelude中的all函数:

evenList = all even

如果您坚持使用mapfilterfoldr

evenList = foldr (&&) True . map even

答案 1 :(得分:5)

myfunc = foldr (\a b -> even a && b) True

答案 2 :(得分:1)

Frerich的解决方案效果很好,但只需触摸即可优化:

evenList :: [Integer] -> Bool
evenList = foldr ((&&) . even) True

这只会在列表中运行一次。这里的函数组合有点奇怪,但在检查其类型时变得更加清晰:

(&&) . even :: Integral a => a -> Bool -> Bool

even的结果,它接受一个参数,然后绑定到&&运算符的第一个参数,此处以前缀表示法使用。