[Haskell-cafe] Re: Library design question

David Menendez dave at zednenem.com
Sat Sep 20 02:53:01 EDT 2008


On Fri, Sep 19, 2008 at 7:02 PM, Andre Nathan <andre at digirati.com.br> wrote:
> On Fri, 2008-09-19 at 23:16 +0200, Daniel Fischer wrote:
>> Yes. What's IO gotta do with it?
>
> I did it because of randomIO :(
>
>> (or what about StateT (Graph a b) (State StdGen) ?).
>
> Now there's something I wouldn't have thought of... I changed the
> RandomGraph type to
>
>  type RandomGraph a b = StateT (Graph a b) (State StdGen) ()
>
> and randomFloat to
>
>  randomDouble :: State StdGen Double
>  randomDouble = State random
>
> and randomGraph to
>
>  randomGraph :: StdGen -> Int -> Double -> Graph Int Int
>  randomGraph gen n p = evalState (execStateT create Graph.empty) gen
>    where create = mapM_ (uncurry $ createVertex p) vls
>          vls    = zip [1..n] (repeat 42)
>
> However, when I try to create a graph with 1000 vertices I get a stack
> overflow, which didn't happen in the IO version. Any idea why that happens?

I believe modify is lazy. Try replacing it with a stricter version,

modify' f = do
    s <- get
    put $! f s

-- 
Dave Menendez <dave at zednenem.com>
<http://www.eyrie.org/~zednenem/>


More information about the Haskell-Cafe mailing list