2026-09-07
SwapRefs.hs
import Data.IORef
swapRefs :: IORef a -> IORef a -> IO ()
swapRefs r1 r2 = undefined -- write this: swap the values held by r1 and r2
swapRefsを実装してください。r1とr2という2つのIORefが持つ値を入れ替えます。
Reference
swapRefs :: IORef a -> IORef a -> IO ()
swapRefs r1 r2 = do
v1 <- readIORef r1
v2 <- readIORef r2
writeIORef r1 v2
writeIORef r2 v1
C言語のポインタ交換(*aと*bの入れ替え)と発想はまったく同じで、それぞれのセルから値を読み出し、一時的に手元に持ってから書き戻します。値自体は不変(immutable)でも、IORefが指すセルの中身は書き換えられるので、これは正真正銘の副作用を伴う操作です。これは参考実装であり、唯一の正解ではありません。