{- Beispiele zu monadischen Kompositionsoperatoren -}

-- Kontrollstrukturen

-- n-fache Wiederholung einer IO-Aktion
repeatN     :: Int -> IO a -> IO ()
repeatN 0 a =  return ()
repeatN n a =  a >> repeatN (n-1) a

test0 = repeatN 5 (putChar 'a')

-- Sequenzen
{- 
-- vordefiniert 
sequence_ :: [IO a] -> IO ()
sequence_ =  foldr (>>) (return ())

-- sequence :: [IO a] -> IO [a]
sequence [] = return []
sequence (a:as) = do r <- a
                     rs <- sequence as 
                     return (r:rs)
-}

-- for-Schleife
for_ :: [a] -> (a->IO ()) -> IO()
for_ =  curry (sequence_ . (uncurry (flip map)))

test1 = for_ ['1'..'9'] putChar 

for :: [a] -> (a->IO b) -> IO [b]
for =  curry (sequence . (uncurry (flip map)))

test2 = (for ['1'..'9'] (\ c -> (putChar c >> getChar))) 
        >>= \cs ->  putStr cs



