有一个布尔列表,如果列表包含奇数个True组件,我需要返回True。但我不知道从哪里开始。任何帮助都会很感激。
答案 0 :(得分:1)
基本上,您需要一个如下所示的函数:
f x True = not x
f x False = x
此函数使用第一个参数作为"状态",如果第二个参数是True
然后翻转x
,如果第二个参数是False
那么don& #39;对x
做任何事情。然后,您可以使用foldl
(或Data.List.foldl'
获得更好的效果)来确定列表中True
的数量是否为奇数:
hasOddTrues :: [Bool] -> Bool
hasOddTrues bs = foldl f False bs
此代码等同于Python代码
def f(x, y):
if y: return not x
else: return x
def hasOddTrues(bs):
isOdd = False
for b in bs:
isOdd = f(isOdd, b)
return isOdd
在fold
中概括了迭代一个项集合的概念,其状态在每次迭代时都会发生变化,具体取决于先前的值和当前元素。