readItem :: Int -> IO Item readItem i = do putStrLn $ "Enter item #" <> show i name <- readLn price <- readLn pure (name, price)
total :: [Item] -> Int total items = sum (map snd item)
main = do n <- readLn items <- for [1..n] readItem print $ total items
инлайн версия
main = do n <- readLn items <- for [1..n] \i -> do putStrLn $ "Enter item #" <> show i name <- readLn :: IO String price <- readLn :: IO Int pure (name, price) print $ sum $ map snd $ items
for принимает в данном случае список чисел от 1 до n, и для каждого числа выполняет какое-то IO действие, которое что-то возвращает (в данном примере пару)
readItem :: Int -> IO Item readItem i = do putStrLn $ "Enter item #" <> show i name <- readLn price <- readLn pure (name, price)
total :: [Item] -> Int total items = sum (map snd item)
main = do n <- readLn items <- for [1..n] readItem print $ total items
инлайн версия
main = do n <- readLn items <- for [1..n] \i -> do putStrLn $ "Enter item #" <> show i name <- readLn :: IO String price <- readLn :: IO Int pure (name, price) print $ sum $ map snd $ items