[Haskell-cafe] fishing for ST mutable Vector examples

Gregory Collins greg at gregorycollins.net
Sun Apr 24 13:05:15 CEST 2011


I also recently implemented a Fisher-Yates shuffle in mutable vectors.
I probably should have used Gen (from mwc-random) in ST, but I already
had a GenIO hanging around for other reasons.

------------------------------------------------------------------------------
import           Control.Monad.ST                     (unsafeIOToST)
import           Data.Vector                          (Vector)
import qualified Data.Vector                          as V
import qualified Data.Vector.Mutable                  as MV
import           System.Random.MWC

shuffle :: GenIO -> Vector k -> Vector k
shuffle rng v = if V.null v then v else V.modify go v
  where
    !n = V.length v

    go mv = f (n-1)
      where
        -- note: inclusive
        pickOne b = unsafeIOToST $ uniformR (0,b) rng

        swap = MV.unsafeSwap mv

        f 0  = return ()
        f !k = do
            idx <- pickOne k
            swap k idx
            f (k-1)
------------------------------------------------------------------------------

G.

On Sun, Apr 24, 2011 at 5:21 AM, Globules <globules at gmail.com> wrote:
> brad clawsie <clawsie <at> fastmail.fm> writes:
>
>>
>> hi all
>>
>> i was wondering if anyone could post some minimal examples on using
>> mutable Vectors in the ST monad. i've been digging around in the usual
>> places but haven't been able to find anything to get me over the hump
>>
>> thanks in advance
>> brad
>>
>
> I was just looking into the same thing.  This link at Rosetta Code has
> a list shuffling function, which is my first experiment with mutable
> Vectors:
>
>    http://rosettacode.org/wiki/Balanced_brackets#Haskell
>
> The list is converted to a mutable Vector, the mapM_ performs a series
> of element swaps, then the result is frozen and converted back to a
> list.
>
> - Globules
>
>
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>



-- 
Gregory Collins <greg at gregorycollins.net>



More information about the Haskell-Cafe mailing list