import Data.Foldable (traverse_)
import Control.Monad
import Control.Monad.ST
import Data.STRef
comp1 :: ST s (STRef s Int)
comp1 = do
-- ...
newSTRef 0
comp2 :: STRef s Int -> ST s Int
comp2 ref = do
-- ...
readSTRef ref
--main = print $ runST (comp2 (runST comp1))
countZeros :: [Int] -> Int
countZeros = length . filter (== 0)
countZerosST :: [Int] -> Int
countZerosST xs = runST $ do
c <- newSTRef 0
traverse_ (\x -> when (x==0) $ inc c) xs
readSTRef c
where
inc c = modifySTRef' c (+1)
main = do
print $ runST (comp1 >>= comp2)
print $ countZeros $ replicate 1000 0
print $ countZerosST $ replicate 1000 0