diff options
author | Vivian McPhail <haskell.vivian.mcphail@gmail.com> | 2010-08-28 11:29:57 +0000 |
---|---|---|
committer | Vivian McPhail <haskell.vivian.mcphail@gmail.com> | 2010-08-28 11:29:57 +0000 |
commit | 693cae17c1e4ae3570f35324119f47ca6103f3cf (patch) | |
tree | 52cd26440025575a2e339fb542593325a3668df4 /examples/vector-map.hs | |
parent | 5e60b08d76e666643c795131bcbb18d196a39520 (diff) |
add withIndex traversal
Diffstat (limited to 'examples/vector-map.hs')
-rw-r--r-- | examples/vector-map.hs | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/examples/vector-map.hs b/examples/vector-map.hs index f116946..7796cc0 100644 --- a/examples/vector-map.hs +++ b/examples/vector-map.hs | |||
@@ -30,12 +30,45 @@ addInitialM = mapVectorM_ (\x -> do | |||
30 | put $ x + i | 30 | put $ x + i |
31 | ) | 31 | ) |
32 | 32 | ||
33 | -- sum the values of the even indiced elements | ||
34 | sumEvens :: Vector Int -> Int | ||
35 | sumEvens = foldVectorWithIndex (\x a b -> if x `mod` 2 == 0 then a + b else b) 0 | ||
36 | |||
37 | -- sum and print running total of evens | ||
38 | sumEvensAndPrint :: Vector Int -> VectorMonadT () | ||
39 | sumEvensAndPrint = mapVectorWithIndexM_ (\ i x -> do | ||
40 | when (i `mod` 2 == 0) (do | ||
41 | v <- get | ||
42 | put $ v + x | ||
43 | v' <- get | ||
44 | liftIO $ putStr $ (show v') ++ " " | ||
45 | return ()) | ||
46 | return () | ||
47 | ) | ||
48 | |||
49 | indexPlusSum :: Vector Int -> VectorMonadT () | ||
50 | indexPlusSum v' = do | ||
51 | v <- mapVectorWithIndexM (\i x -> do | ||
52 | s <- get | ||
53 | let inc = x+s | ||
54 | liftIO $ putStr $ show (i,inc) ++ " " | ||
55 | put inc | ||
56 | return inc) v' | ||
57 | liftIO $ do | ||
58 | putStrLn "" | ||
59 | putStrLn $ show v | ||
60 | |||
33 | ------------------------------------------- | 61 | ------------------------------------------- |
62 | |||
34 | main = do | 63 | main = do |
35 | v' <- test1 v | 64 | v' <- test1 v |
36 | putStrLn "" | 65 | putStrLn "" |
37 | putStrLn $ show v' | 66 | putStrLn $ show v' |
38 | evalStateT (addInitialM v) 0 | 67 | evalStateT (addInitialM v) 0 |
39 | putStrLn "" | 68 | putStrLn "" |
69 | putStrLn $ show (sumEvens v) | ||
70 | evalStateT (sumEvensAndPrint v) 0 | ||
71 | putStrLn "" | ||
72 | evalStateT (indexPlusSum v) 0 | ||
40 | return () | 73 | return () |
41 | 74 | ||