[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