【해답 예】Haskell IO 모나드 초입문

【해답 예】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모나드를 다루는 returnunIO 를 구현해 주세요. 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()