09/07/12 18:48:58
>>447
StateT の練習
-- Haskell
import Control.Monad.State
import Data.Function (on)
import System.IO (hFlush, stdout)
t447 :: Int -> IO (Int,Double)
t447 m = evalStateT (t447' m 1) []
where
t447' :: Int -> Int -> StateT [Int] IO (Int,Double)
t447' m i = do
ls <- get
liftIO $ (putStr $ "No." ++ show i ++ ": ") >> hFlush stdout
s <- liftIO $ getLine
modify (++[read s])
if i == m then get >>= return . sumAndAverage else t447' m (i+1)
sumAndAverage :: [Int] -> (Int,Double)
sumAndAverage = f . foldl (\(s,l) x -> (s+x,l+1)) (0,0)
where
f :: (Int,Int) -> (Int,Double)
f (s,l) = (s, on (/) fromIntegral s l)
main = t447 6 >>= putStrLn . toString
where
toString :: (Int,Double) -> String
toString (s,a) = "sum: "++show s++"\naverage: "++show a