2014-10-22 58 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

相關問題