2014-08-31 107 views
2

Learn You a Haskell討論「製作一個單子」具有以下Prob類型:轉換爲Pointfree風格?

import Data.Ratio 

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

Prob表示a類型,然後被用於表示此a的概率的Rational

讓我們看一個Prob實例:

*Main> Prob [('a', 1%2), ('b', 1%2)] 
Prob {getProb = [('a',1 % 2),('b',1 % 2)]} 

LYAH提出了一個鍛鍊弄清楚如何把thisSituationProb(Prob Char)類型爲Prob Char

thisSituation :: Prob (Prob Char) 
thisSituation = Prob 
    [(Prob [('a', 1%2),('b',1%2)], 1%4) 
    ,(Prob [('c', 1%2),('d',1%2)], 3%4) 
    ] 

這就是我想出了:

flatten :: Prob (Prob a) -> Prob a 
flatten pp = Prob $ convert $ getProb pp 

convert :: [(Prob a, Rational)] -> [(a, Rational)] 
convert xs = concat $ map f xs 

f :: (Prob a, Rational) -> [(a, Rational)] 
f (p, r) = map (mult r) (getProb p) 

mult :: Rational -> (a, Rational) -> (a, Rational) 
mult r (x, y) = (x, r*y) 

我試圖point-free像這樣:

flatten :: Prob (Prob a) -> Prob a 
flatten = Prob $ convert $ getProb 

但得到這個錯誤:

*Main> :l MakingMonad.hs 
[1 of 1] Compiling Main    (MakingMonad.hs, interpreted) 

MakingMonad.hs:37:11: 
    Couldn't match expected type `Prob (Prob a) -> Prob a' 
       with actual type `Prob a0' 
    In the expression: Prob $ convert $ getProb 
    In an equation for `flatten': flatten = Prob $ convert $ getProb 

MakingMonad.hs:37:28: 
    Couldn't match expected type `[(Prob a0, Rational)]' 
       with actual type `Prob a1 -> [(a1, Rational)]' 
    In the second argument of `($)', namely `getProb' 
    In the second argument of `($)', namely `convert $ getProb' 
    In the expression: Prob $ convert $ getProb 
Failed, modules loaded: none. 

我可以flatten點,免費的嗎?如果是這樣,請告訴我如何。如果沒有,請解釋原因。

+0

變化'$''要在.''flatten' – 2014-08-31 15:16:26

回答

7

當您使用flatten$,你得到的代碼看起來像

flatten = Prob $ convert $ getProb 
==> Prob (convert (getProb)) 

這是不是你想要的。

你想Prob . convert . getProb

+0

所以,如果我理解,因爲'getProb'嵌套在'習題(轉換(',這是不可能的使用點對多點自由風格?但是,有了函數組合,這是可能的 – 2014-08-31 15:26:53

+3

@KevinMeredith當你編寫'Prob(convert getProb)'時,你將'(convert getProb)'作爲參數傳遞給'Prob'。'Prob'不帶函數作爲參數,'convert'也不會將函數作爲參數,所以你會得到類型錯誤。 – 2014-08-31 15:28:39

+0

這就是爲什麼'f。g $ h' x''樣式經常是首選而不是'f $ g $ hx' - 更容易轉換爲無點式風格。 – 2014-08-31 16:41:18