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 <an...@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@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe > _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe