[Haskell-cafe] Trouble with the ST monad
Ryan Ingram
ryani.spam at gmail.com
Sun Dec 21 19:47:01 EST 2008
The problem is that you are trying to return a mutable array out of an
ST computation. This lets the "mutability" of the computation escape.
That's what the "s" type variable is for; without it, runST is just
unsafePerformIO.
To solve your problem, you need to eliminate any references to the
state from the output of runST. I suggest looking into the function
"freezeSTArray":
>From http://haskell.org/ghc/docs/latest/html/libraries/base/GHC-Arr.html#v:freezeSTArray
freezeSTArray :: Ix i => STArray s i e -> ST s (Array i e)
(See my annotation at http://hpaste.org/13240#a2)
This allows you to remove any reference to the state from the array
computation. Alternatively, if you want this to be part of a larger
mutable computation, you can return the result in ST; this is what the
version of shuffle you have in the paste does.
-- ryan
On Sun, Dec 21, 2008 at 4:14 PM, Andre Nathan <andre at digirati.com.br> wrote:
> Hello,
>
> I'm trying to write a function that would take an STArray and and
> shuffle its elements. I'm having trouble with the ST monad, though, and
> couldn't find out how fix this issue.
>
> The problem happens when I use runST to extract the shuffled array from
> the ST monad. I'm getting the following error:
>
> Inferred type is less polymorphic than expected
> Quantified type variable `s' is mentioned in the environment:
> a :: STArray s Int a
>
> The full code is at
>
> http://hpaste.org/13240#a1
>
> Any help would be appreciated.
>
> Thanks,
> Andre
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
More information about the Haskell-Cafe
mailing list