如何在不使用计数的情况下计算Haskell中的布尔值?

时间:2014-10-22 03:18:09

标签: haskell

有一个布尔列表,如果列表包含奇数个True组件,我需要返回True。但我不知道从哪里开始。任何帮助都会很感激。

1 个答案:

答案 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中概括了迭代一个项集合的概念,其状态在每次迭代时都会发生变化,具体取决于先前的值和当前元素。