2014-10-22 24 views
-2

有一个布尔表的列表,如果列表包含奇数个True分量,我需要返回True。但我不知道从哪里开始。任何帮助将不胜感激。如何计算Haskell中的布尔值而不使用count?

+0

你尝试过奇怪吗?长度 。过滤器(== True)$ list'其中'list'是您的布尔值列表? – 2014-10-22 03:23:41

+0

最后我做这种方式 XOR = \ BS - >如果MOD(长度(过滤器(==真)BS))2 == 0则假否则真 感谢您的帮助 – Huskey27 2014-10-22 04:00:57

+3

'奇怪。总和。来自Enum的地图 – user2407038 2014-10-22 04:31:13

回答

1

基本上,你想要的功能,看起来像这样:

f x True = not x 
f x False = x 

该函数使用第一个参数作为一个“国家”,如果第二个参数是True然后翻转x,如果第二个参数是False那么不要对x做任何事情。然后,您可以使用foldl(或Data.List.foldl'获得更好的性能)来确定的True S IN列表中的数是奇数:

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

+4

不是你的'f'函数只是'(/ =):: Bool - > Bool - > Bool'?我认为如果你把它看作是列表中的N个项目(因为Bools,xor与/ =相同),它会更清晰。 – amalloy 2014-10-22 03:44:52

+3

为什么不写'奇怪的。长度 。过滤器(== True)'?它更具可读性。另外由于[流融合](http://www.reddit.com/r/haskell/comments/1br0ls/haskell_beats_c_using_generalised_stream_fusion/),它将非常有效地运行。 – 2014-10-22 04:57:15

相关问题