[Haskell-beginners] Using Debug.Trace

legajid legajid at free.fr
Tue Feb 2 16:21:25 EST 2010


Hi,
it works fine, except

        (xv1,ok1) = calcul'' pxv c vallib `debug` ("  " ++ show xv1) 
                             `debug` ("  Calcul' ok1=" ++ show ok1 ++ " 
c:cs= " ++ show (c:cs))


that causes an infinite loop, cause xv1 and ok1 are just being calculated.

Thank you for your clear explanation of do statements.

Didier.

 


Daniel Fischer a écrit :
> Am Sonntag 31 Januar 2010 10:25:58 schrieb legajid:
>   
>> Hi,
>>
>> Starting with trace, i have trouble  with my calcul'' function while
>> calcul' is ok.
>> When afftrace in calcul'' is commented, the program compiles.
>> When uncommented (            afftrace ("    calcul'' vide") ), i get
>> the following messages :
>>
>> ------------------------------------------------------------------------
>> ------------------- *Main> :r
>> [1 of 1] Compiling Main             ( sud3c.hs, interpreted )
>>
>> sud3c.hs:62:3:
>>     Couldn't match expected type `[Char]'
>>            against inferred type `(Plateau, Char)'
>>     In a stmt of a 'do' expression: afftrace ("    calcul'' vide")
>>     In the expression:
>>         do afftrace ("    calcul'' vide")
>>            (pxv, False)
>>     In the definition of `calcul''':
>>         calcul'' pxv _ []
>>                    = do afftrace ("    calcul'' vide")
>>                         (pxv, False)
>> Failed, modules loaded: none.
>> ------------------------------------------------------------------------
>> -------------------
>>
>> I don't understand why, in calcul', it's ok and why, in calcul'', it's
>> problematic. Because return value of calcul'' is a tuple ?
>>     
>
> You defined
>
>   
>> afftrace x= if modetrace then trace x " "
>>              else " "
>>     
>
> If you ask ghci the type of that, you'll get
>
> ghci> :t afftrace
> afftrace :: String -> [Char]
>
> (or afftrace :: [Char] -> [Char], or String -> String)
>
> since
>
> ghci> :t trace
> trace :: String -> a -> a
>
> Now you use afftrace in a do-block, which means "afftrace x" must have type
>
> (Monad m) => m a
>
> for some m and a. 
> Well, afftrace x has type [Char], so m is [] and a is Char, fine.
>
> That means you can use afftrace in any calculation returning a list of some 
> kind (outside of do-blocks, also in other calculations).
>
> But calcul'' doesn't return a list, it returns a pair. So
>
> calcul'' pxv _ [] = afftrace ("  calcul'' vide") >> (pxv,False)
>
> , which is what the first equation of calcul'' is desugared to, isn't well 
> typed.
>
> (>>) :: Monad m => m a -> m b -> m b
>
> afftrace "  calcul'' vide" :: [] Char   -- m === [], a === Char
>
> (pxv,False) :: (,) Plateau Bool   -- m === ((,) Plateau), b === Bool
>
>
> (actually, ((,) Plateau) is indeed a monad, but it's a different one from 
> [], so the expression is not well typed).
>
> You could
> - modify calcul'' to return [(Plateau,Bool)]
> - not use do-blocks just for the sake of tracing and restructure your code
> (I recommend the second)
>
> infixl 0 `debug`
>
> debug = flip trace
>
> calcul' pxv [] = pxv `debug` "  Calcul' vide"
> calcul' pxv (c:cs)
>     | ok1       = calcul' xv1 cs `debug` "  Calcul' suite"
>     | otherwise = pxv `debug` "  Calcul' pas de valeur"
>       where
>         vallib = [1 .. length pxv] ++ [5 .. 7]
>         nbvlib = length vallib
>         (xv1,ok1) = calcul'' pxv c vallib `debug` ("  " ++ show xv1) 
>                              `debug` ("  Calcul' ok1=" ++ show ok1 ++ " 
> c:cs= " ++ show (c:cs))
>
> calcul'' pxv _ [] = (pxv,False) `debug` "  calcul'' vide"
> calcul'' pxv c (li:lis)
>     | False `debug` "  " ++ show pvx ++ "..." = undefined
>     | li == 4 || li `elem` pxv  = calcul'' pxv c lis `debug` "quoi?"
>     | otherwise     = (calcul'' pxv c li,True) `debug` "   calcul'''"
>
> Now the code reads more natural (except for the "False `debug` ... " to 
> produce general debugging output), and removing the debugging output isn't 
> any harder.
>
>   
>> When my program is ok, should i remove all trace instructions (and
>> associated do commands too) or just set  my modetrace value to False ?
>>
>>     
>
> Remove, resp. comment out.
>
>   
>> Thanks for helping,
>> Didier
>>
>> Below my code :
>>
>>
>> calcul' :: Plateau -> [Cellule] -> Plateau
>> calcul' pxv  [] = do
>>             afftrace ("  Calcul' vide")
>>             pxv
>> calcul' pxv  (c:cs)=    do
>>             afftrace ("  Calcul' ok1="++show ok1++" c:cs= "++show
>> (c:cs)) afftrace ("  "++show xv1)
>>
>>             if ok1  then do
>>                     afftrace ("  Calcul' suite")
>>                     calcul' xv1 cs
>>                 else do
>>                     afftrace ("  Calcul' pas de valeur")
>>                     pxv
>>     where
>>         vallib=[1..length pxv]++[5..7]
>>         nbvlib=length vallib
>>         (xv1,ok1)=calcul'' pxv c vallib
>>
>>
>>
>> calcul'' :: Plateau -> Cellule -> [Valeur] -> (Plateau, Bool)
>> calcul'' pxv  _ [] = do
>>             --afftrace ("    calcul'' vide")
>>             (pxv, False)
>>
>> calcul'' pxv  c (li : lis) = do
>>                 --afftrace ("    "++show pxv)
>>                 --afftrace ("    "++show c ++ "   "++show(li:lis))
>>                 v2
>>                 where
>>                   v2= if (elem li pxv || li==4)
>>                     then
>>                         calcul'' pxv  c lis
>>                     else do
>>                         --afftrace ("      calcul'''")
>>                         (calcul''' pxv c li, True)
>>
>> calcul''' :: Plateau -> Cellule -> Valeur -> Plateau
>> calcul''' pxv c li =
>>     take (c-1) pxv ++ [li] ++ drop c pxv
>>
>> afftrace x= if modetrace then trace x " "
>>              else " "
>>     
>
>
>   


More information about the Beginners mailing list