[Haskell-beginners] Laziness problem, some code never being executed, when using Control.Monad.State.Strict

Olivier Boudry olivier.boudry at gmail.com
Sat Jan 26 17:29:20 CET 2013


Hi folks,

I'm using the state monad (Control.Monad.State.Strict) to keep track of the
state of a monopoly game (Project Euler problem #84). I'm really close to
get something that works, but I just have some code with side effects only
that does not execute and I struggle force it to execute. I used hpc to
discover which part of the code was never run and found lines 93 to 95. In
those lines I'm trying to update a visits Map that holds the number of
times I've been on a particular cell of the board. What I don't understand
is that the code in lines 66 to 68 is almost identical and this one gets
executed. The visit Map is used at the very end to retrieve results.

   57 execAction :: State Monopoly ()   58 execAction = do   59     m
<- get   60     let b = board m   61     let s = CL.value b   62
case s of   63         (CC _) -> execCommunityChest   64         (CH
_) -> execChance   65         G2J    -> execMove gotoJail   66
_      -> do   67             let v = insertWith (+) s 1 (visit m)
68             put m {visit = v}...

   80     let c = cc m   81     c' <- execCard c   82     put m {cc =
c'}   83    84 execCard :: CardsDeck -> State Monopoly CardsDeck   85
execCard cd = do   86     let cd' = CL.next cd   87     case CL.value
cd of   88         Just mv -> do   89             execMove mv   90
        return cd'   91         Nothing -> do   92             m <-
get   93             let s = CL.value $ board m   94             let v
= insertWith (+) s 1 (visit m)   95             put m {visit = v}   96
            return cd'

I tried to play with some $! to force execution but it never goes deep
enough and I don't really know where to place these. I did not copy the
whole solution as requested on the Project Euler site.

Any help on this would be greatly appreciated,

Thanks,

Olivier.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20130126/c0655f90/attachment.htm>


More information about the Beginners mailing list