2017-04-10 48 views
0

我穿過For A Few Monads More章工作相結合的概率元素瞭解你的Haskell偉大的好,並在最後一節,他們定義表示與概率結果的類型如下:在Haskell

newtype Prob a = Prob { getProb :: [(a,Rational)] } deriving Show 

在本節結尾部分有一個練習,將相同結果的概率組合在一起,我正試圖找出解決這個問題的最佳方法。

我們看到我們的monad不知道如何加入所有的硬幣都不會將尾巴放入一個結果的虛假結果。這不是一個大問題,因爲編寫一個函數將所有相同的結果放到一個結果中是非常容易的,並且作爲練習留給讀者(你!)

我還是不太習慣但我覺得這可以通過對列表中的所有結果進行摺疊來檢查結果是否存在於累加器中。 如果它不存在,我們只需將結果添加到累加器中,如果它存在,我們只需要通過添加概率來更新累加器中的結果。

我在正確的軌道上,還是我在想這個錯誤的方式?

編輯: 這是我在實施這一企圖:

outcomeExists :: [(Bool, Rational)] -> Bool -> Bool 
outcomeExists xs out = (length $ filter (\(a,b) -> a == out) xs) > 0 

probFold :: [(Bool,Rational)] -> (Bool, Rational) -> [(Bool,Rational)] 
probFold acc (out,prob) 
    | outcomeExists acc out = [if a == out then (a,b+prob) else (a,b) | (a,b) <- acc] 
    | otherwise    = (out,prob):acc 

是一個列表理解修改累加器的匹配結果的最佳方式?我想不出任何其他更清潔的東西。

此外,儘管這似乎在ghci中工作,當我進入Prob (foldl probFold [] (getProb flipThree)),其中flipThree具有類型Prob Bool,我在定義一個函數,需要一個習題BOOL和產生相同的輸出麻煩。

當我嘗試編譯此:

combineOutcomes :: Prob Bool -> Prob Bool 
combineOutcomes (Prob a) = Prob[foldl probFold [] a] 

我得到這個錯誤,但我不明白爲什麼有一個類型不匹配,因爲它在ghci中正常工作。

monads.hs:89:33: error: 
    • Couldn't match expected type ‘(Bool, Rational)’ 
        with actual type ‘[(Bool, Rational)]’ 
    • In the expression: foldl probFold [] a 
     In the first argument of ‘Prob’, namely ‘[foldl probFold [] a]’ 
     In the expression: Prob [foldl probFold [] a] 

回答

0

你是在正確的軌道上。給它一個鏡頭,然後如果你遇到問題,再次詢問有關給你帶來麻煩的更多細節。

+0

我編輯我的問題與我的解決方案嘗試 - 我會很感激任何反饋/幫助獲得函數編譯。謝謝! – Jazzy

+0

@Jazzy你好親近!只需將'Prob [...]'改爲'Prob(...)'。還有其他一些變化可能需要考慮提高效率,但只是爲了讓自己脫離現實而跑步,這應該會讓你走上正軌。 –