
【해답 예】Haskell IO 모나드 초입문
2022-10-04 last update
6 minutes reading 하스켈Haskell IO 모나드 초입문 의 해답 예입니다.
셔플
셔플
【질문 1】 다음 코드에서 do
{-# LANGUAGE UnboxedTuples #-}
import GHC.Base
import System.Random
shuffle [] = IO $ \s -> (# s, [] #)
shuffle xs = IO $ \s ->
let (# s1, n #) = unIO (getStdRandom $ randomR (0, length xs - 1) :: IO Int) s
(# s2, xs' #) = unIO (shuffle $ take n xs ++ drop (n + 1) xs) s1
in (# s2, (xs !! n) : xs' #)
main = IO $ \s ->
let (# s1, xs #) = unIO (shuffle [1..9]) s
(# s2, r #) = unIO (print xs) s1
in (# s2, r #)
실행 결과(매번 다름)[3,5,4,9,2,7,8,6,1]
재구성
【문 2】IO모나드를 다루는 return
와 unIO
를 구현해 주세요. IO
, bind
, return'
, >>=
는 사용하지 마십시오.
{-# LANGUAGE UnboxedTuples #-}
import GHC.Base
a `bind` b = IO $ \s ->
let (# s1, r1 #) = unIO a s
(# s2, r2 #) = unIO (b r1) s1
in (# s2, r2 #)
return' x = IO $ \s -> (# s, x #)
main = return' "hello" `bind` putStr `bind` print
실행 결과hello()
{-# LANGUAGE UnboxedTuples #-}
import GHC.Base
import System.Random
shuffle [] = IO $ \s -> (# s, [] #)
shuffle xs = IO $ \s ->
let (# s1, n #) = unIO (getStdRandom $ randomR (0, length xs - 1) :: IO Int) s
(# s2, xs' #) = unIO (shuffle $ take n xs ++ drop (n + 1) xs) s1
in (# s2, (xs !! n) : xs' #)
main = IO $ \s ->
let (# s1, xs #) = unIO (shuffle [1..9]) s
(# s2, r #) = unIO (print xs) s1
in (# s2, r #)
[3,5,4,9,2,7,8,6,1]
【문 2】IO모나드를 다루는
return
와 unIO
를 구현해 주세요. IO
, bind
, return'
, >>=
는 사용하지 마십시오.{-# LANGUAGE UnboxedTuples #-}
import GHC.Base
a `bind` b = IO $ \s ->
let (# s1, r1 #) = unIO a s
(# s2, r2 #) = unIO (b r1) s1
in (# s2, r2 #)
return' x = IO $ \s -> (# s, x #)
main = return' "hello" `bind` putStr `bind` print
실행 결과
hello()