Namaran

Code daily. Without assist.

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を実装してください。r1r2という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が指すセルの中身は書き換えられるので、これは正真正銘の副作用を伴う操作です。これは参考実装であり、唯一の正解ではありません。