fork download
  1. import Control.Monad (forM,forM_,(<=<),unless,replicateM)
  2. import Data.Array.IO (IOUArray,newArray,newArray_,readArray,writeArray,freeze)
  3. import Data.Array.Unboxed (listArray,Array,UArray,(!))
  4. import Data.Int (Int64)
  5. import Data.IORef (IORef,newIORef,readIORef,writeIORef,modifyIORef)
  6. import Data.Ix
  7.  
  8. fooArray = newArray_ (0,3) :: IO (IOUArray Int Int64)
  9.  
  10. main = do
  11. let len = 3
  12. a <- newArray_ (0, len) :: IO (IOUArray Int Int64)
  13. putStrLn "print a"
  14. forM_ [0..len] (print <=< readArray a)
  15. forM_ [0..len] (\i -> writeArray a i (fromIntegral $ (i+1)*2))
  16. putStrLn "print updated a"
  17. forM_ [0..len] $ \i -> do
  18. v <- readArray a i
  19.  
  20. rx <- newIORef (123 :: Int64)
  21. x <- readIORef rx -- copy value, not reference
  22. putStr "x "
  23. print x -- 123
  24. writeIORef rx 999
  25. putStr "x "
  26. print x -- 123
  27. x <- readIORef rx
  28. putStr "x "
  29. print x -- 999
  30.  
  31. foo <- fooArray
  32. putStrLn "print foo"
  33. print =<< forM [0..len] (readArray foo)
  34. forM_ [0..len] (\i -> writeArray foo i (fromIntegral $ (i+1)*2))
  35. putStrLn "print updated foo"
  36. print =<< forM [0..len] (readArray foo)
  37. bar <- fooArray
  38. putStrLn "print bar"
  39. print =<< forM [0..len] (readArray bar)
  40.  
  41. (primes, isPrime) <- primeTool (10^8)
  42. print (take 30 primes)
  43. print (filter isPrime [10^7..10^7+300])
  44.  
  45. arr <- genIntArray 10 0
  46. forM_ [0..9] $ \i -> writeIORef (arr!i) (i*(i+1)`div`2)
  47. print =<< forM [0..9] (readIORef.(arr!))
  48.  
  49. table <- genMatrix 5 5 0
  50. forM_ [0..4] $ \i -> do
  51. forM_ [0..4] $ \j -> do
  52. writeIORef (table!i!j) (i*100+j)
  53. print =<< forM [0..4] (\i -> forM [0..4] (readIORef.(table!i!)))
  54.  
  55.  
  56.  
  57. genArray :: (Integral a,Ix a) => a -> IO b -> IO (Array a b)
  58. genArray n initf = listArray (0,n-1) <$> replicateM (fromIntegral n) initf
  59.  
  60. genIntArray :: (Integral a, Ix a) => Integral b => a -> b -> IO (Array a (IORef b))
  61. genIntArray n initv = genArray n (newIORef initv)
  62.  
  63. genMatrix :: (Integral a, Ix a) => a -> a -> b -> IO (Array a (Array a (IORef b)))
  64. genMatrix n m initv = genArray n (genArray m (newIORef initv))
  65.  
  66.  
  67.  
  68. primeTool n = do
  69. table <- newArray (0,n+6) False :: IO (IOUArray Int64 Bool)
  70. primes <- newIORef [3,2]
  71. forM_ [1..((n+5) `div` 6)] $ \i -> do
  72. let x = 6*i - 1
  73. r <- readArray table x
  74. unless r $ do
  75. modifyIORef primes (x:)
  76. forM_ [3,5..((n+5) `div` x)] $ \k -> do
  77. writeArray table (k*x) True
  78. let y = x + 2
  79. q <- readArray table y
  80. unless q $ do
  81. modifyIORef primes (y:)
  82. forM_ [3,5..((n+5) `div` y)] $ \k -> do
  83. writeArray table (k*y) True
  84. writeArray table (y+2) True
  85.  
  86. writeArray table 1 True
  87. table <- freeze table :: IO (UArray Int64 Bool)
  88. primes <- reverse <$> readIORef primes
  89.  
  90. let isPrime v | even v = v == 2
  91. | v < n = not (table!v)
  92. | otherwise = all ((/=0).mod v) $ takeWhile ((<=v).(^2)) primes
  93.  
  94. return (primes, isPrime)
  95.  
  96.  
Success #stdin #stdout 3.39s 585656KB
stdin
Standard input is empty
stdout
print a
0
0
0
0
print updated a
2
4
6
8
x 123
x 123
x 999
print foo
[0,0,0,0]
print updated foo
[2,4,6,8]
print bar
[0,0,0,0]
[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113]
[10000019,10000079,10000103,10000121,10000139,10000141,10000169,10000189,10000223,10000229,10000247,10000253,10000261,10000271]
[0,1,3,6,10,15,21,28,36,45]
[[0,1,2,3,4],[100,101,102,103,104],[200,201,202,203,204],[300,301,302,303,304],[400,401,402,403,404]]