1

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

我想使用的函数是map// filterfoldr可能没有length.

这是我的尝试:

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

我很确定有一种更清洁的方法..不是吗?:)

4

3 回答 3

7

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

evenList = all even

如果您坚持只使用map,filterfoldr

evenList = foldr (&&) True . map even
于 2012-12-07T14:46:20.670 回答
5
myfunc = foldr (\a b -> even a && b) True
于 2012-12-07T14:57:06.873 回答
1

Frerich 的解决方案效果很好,但只需轻轻一点即可优化:

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

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

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

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

于 2012-12-07T17:38:01.583 回答