import Control.Monad
import Text.Read
-- 구구단 출력하는 프로그램
main :: IO ()
main = do
putStr "몇 단을 출력할까요? (0=끝) "
numLine <- getLine
let num = readMaybe numLine :: Maybe Int
case num of
Just num -> do
if num == 0
then return ()
else do
printGugudan num
main
Nothing -> do
putStrLn "잘못 입력하셨습니다!"
main
printGugudan :: Int -> IO ()
printGugudan n = do
forM_ [1..9] (\i -> do
putStrLn $ show n ++ " * " ++ show i ++ " = " ++ show (n * i))
- IO 액션을 이용하면 마치 명령형 언어처럼 저걸 저렇게 쓸 수도 있다. IO 액션에서 호출할 수 있는 함수는 반드시
IO
액션을 내놓는 함수여야 하기 때문에 printGugugdan
의 리턱 값이 IO ()
여야 한다.
- IO 액션 안에서 루프를 돌리려면
forM_
을 쓰는 것이 편하다. 그냥 forM
을 쓰면 루프를 실행할 때마다 IO
액션이 넘어오는데, 결괏값이 중요하지 않다면 forM_
을 쓰는 게 낫다.