4 ms·
What's wrong with this? import qualified Data.Vector.Mutable as V import Control.Monad (when) import qualified System.Random
by tome 9y ago
What's wrong with this?
import qualified Data.Vector.Mutable as V
import Control.Monad (when)
import qualified System.Random as R
main = do
v <- V.replicate 10 0
putStrLn "Initialised to zero"
printThemAll v
setIncreasing v
putStrLn "Set with values increasing by 2"
printThemAll v
addRandomness v
putStrLn "Added a random number to each"
printThemAll v
printThemAll v = loop 0 (V.length v)
where loop i n = do
when (i < n) $ do
e <- V.read v i
print e
loop (i + 1) n
setIncreasing v = loop 0 (V.length v)
where loop i n = do
when (i < n) $ do
V.write v i (i * 2)
loop (i + 1) n
addRandomness v = loop 0 (V.length v)
where loop i n = do
when (i < n) $ do
r <- R.randomIO
e <- V.read v i
V.write v i (e + r)
loop (i + 1) n
- cousin_it 9y agoThat's indeed nice, and made me change my mind somewhat. I wonder if you can write a napkin example that mixes ST with randomness, instead of using IO for everything?
- tome 9y agoIt's not too bad to manually thread a seed around. import qualified Data.Vector.Mutable as V import Control.Monad (when) import qualified System.Random as R import Control.Monad.ST st = runST $ do v <- V.replicate 10 0 setIncreasing v addRandomness v printThemAll v = loop 0 (V.length v) where loop i n = do when (i < n) $ do e <- V.read v i print e loop (i + 1) n setIncreasing v = loop 0 (V.length v) where loop i n = do when (i < n) $ do V.write v i (i * 2) loop (i + 1) n addRandomness v = loop initial_g 0 (V.length v) where seed = 1234 initial_g = R.mkStdGen 1234 -- Seed loop g i n = do when (i < n) $ do let (r, next_g) = R.random g e <- V.read v i V.write v i (e + r) loop next_g (i + 1) n
- cousin_it 9y agoI see, thanks! The imperative version would still look more direct to me, but your versions are very nice.