2014-08-31 103 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