summaryrefslogtreecommitdiff
path: root/testsuite/tests/mdo/should_run/mdorun001.hs
blob: 8527e5b2b1c95d321caf8936811cc95659248ed1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{-# OPTIONS -XRecursiveDo -XScopedTypeVariables #-}

module Main(main) where

import Control.Monad.Fix
import Data.Array.IO
import Control.Monad

norm a = mdo (_, sz) <- getBounds a
	     s <- ioaA 1 s sz 0
	     return ()
    where 
    	  ioaA i s sz acc
	   | i > sz = return acc
	   | True   = do v <- readArray a i
	                 writeArray a i (v / s)
		         ioaA (i+1) s sz $! (v + acc)

toList a = do (_, sz) <- getBounds a
	      mapM (\i -> readArray a i) [1..sz]

test    :: Int -> IO ()
test sz = do
	(arr :: IOArray Int Float) <- newArray (1, sz) 12
	putStrLn "Before: "
	toList arr >>= print 
	norm arr
	putStrLn "After: "
	lst <- toList arr 
	print lst
	putStrLn ("Normalized sum: " ++ show (sum lst))

main = test 10