<div dir="ltr"><div dir="ltr"><div dir="ltr"><div class="gmail_default" style="font-size:large">just for tracing the monad i have this :</div><div class="gmail_default" style="font-size:large"><br></div><div class="gmail_default" style="font-size:large">import Control.Monad<br><br>import Data.Ratio<br>import Data.List (all)<br>import Debug.Trace<br><br>newtype Prob a = Prob { getProb :: [(a,Rational)] } deriving Show<br>        <br>instance Functor Prob where<br>    fmap f (Prob xs) = trace " Functor Prob "<br>                       Prob $ map (\(x,p) -> (f x,p)) xs<br><br>    <br>t<br><br><br>flatten :: Prob (Prob a) -> Prob a<br>flatten (Prob xs) = trace (" flatten " ++ show xs)<br>                    Prob $ concat $ map multAll xs<br>  where multAll (Prob innerxs,p) = trace " multAll "<br>                                   map (\(x,r) -> (x,p*r)) innerxs   <br><br> <br>instance Applicative Prob where<br>   pure = trace " Applicative Prob return " return<br>   (<*>) = trace " Applicative Prob ap " ap<br><br>instance Monad Prob where<br>  return x = trace " Monad Prob return "<br>             Prob [(x,1%1)]<br>  m >>= f = trace " Monad Prob >>= "<br>            flatten (fmap f m)<br>  fail _ = trace " Monad Prob fail "<br>           Prob []<br><br><br>{-<br>instance Applicative Prob where<br><br>  pure a = Prob [(a,1%1)]<br><br>  Prob fs <*> Prob as = Prob [(f a,x*y) | (f,x) <- fs, (a,y) <- as]<br>  <br><br>instance Monad Prob where<br><br>  Prob as >>= f = Prob [(b,x*y) | (a,x) <- as, let Prob bs = f a, (b,y) <- bs]<br><br>-}</div><div class="gmail_default" style="font-size:large"><br></div><div class="gmail_default" style="font-size:large"><br></div><div class="gmail_default" style="font-size:large"><br></div><div class="gmail_default" style="font-size:large">in this :</div><div class="gmail_default" style="font-size:large"><br></div><div class="gmail_default" style="font-size:large">flatten :: Prob (Prob a) -> Prob a<br>flatten (Prob xs) = trace (" flatten " ++ show xs)<br>                    Prob $ concat $ map multAll xs<br>  where multAll (Prob innerxs,p) = trace " multAll "<br>                                   map (\(x,r) -> (x,p*r)) innerxs   <br></div><div class="gmail_default" style="font-size:large"><br></div><div class="gmail_default" style="font-size:large"><br></div><div class="gmail_default" style="font-size:large">i have this error:</div><div class="gmail_default" style="font-size:large"><br></div><div class="gmail_default" style="font-size:large">[1 of 1] Compiling Main             ( monade.hs, interpreted )<br><br>monade.hs:22:43: error:<br>    • No instance for (Show a) arising from a use of ‘show’<br>      Possible fix:<br>        add (Show a) to the context of<br>          the type signature for:<br>            flatten :: forall a. Prob (Prob a) -> Prob a<br>    • In the second argument of ‘(++)’, namely ‘show xs’<br>      In the first argument of ‘trace’, namely ‘(" flatten " ++ show xs)’<br>      In the expression: trace (" flatten " ++ show xs) Prob<br>   |<br>22 | flatten (Prob xs) = trace (" flatten " ++ show xs)<br>   |                                           ^^^^^^^<br>Failed, no modules loaded.<br></div><div class="gmail_default" style="font-size:large"><br></div><div class="gmail_default" style="font-size:large">how can i implement a show for xs ?</div><div class="gmail_default" style="font-size:large">regards,</div><div class="gmail_default" style="font-size:large">damien<br></div></div></div></div>