{-# LANGUAGE FlexibleContexts #-} import Data.Array.IO import System.Random randomArray :: Int -> Int -> Int -> Int -> IO (IOArray Int Int) randomArray i1 i2 mn mx = do arr <- newArray (i1,i2) mn -- 仮に mn で初期化する loop i1 i2 mn mx arr return arr where loop i i2 mn mx a | i > i2 = return () | otherwise = do r <- randomRIO (mn, mx) writeArray a i r loop (i + 1) i2 mn mx a printArray :: Show a => IOArray Int a -> IO () printArray arr = do (i1,i2) <- getBounds arr loop i1 i2 arr where loop i1 i2 arr | i1 > i2 = return () | otherwise = do a <- readArray arr i1 putStr (show a) putStr ", " loop (i1 + 1) i2 arr accumArray arr = do (i1, i2) <- getBounds arr loop i1 i2 0 arr where loop i1 i2 v arr | i1 > i2 = return () | otherwise = do a <- readArray arr i1 let v' = a + v writeArray arr i1 v' loop (i1 + 1) i2 v' arr main = do arr <- randomArray 1 5 0 100 printArray arr putStrLn "" accumArray arr printArray arr putStrLn ""