2026-09-07
Alias.hs
import Data.IORef
main :: IO ()
main = do
a <- newIORef (1 :: Int)
let b = a
writeIORef b 5
x <- readIORef a
print x
これは何を出力するでしょうか?
Answer
5。IORefは値そのものではなく、書き換え可能なセルへの参照です。let b = aはaの中身をコピーするのではなく、bをaと全く同じ参照に束縛するだけなので、aとbは同じセルを指す別名です。writeIORef b 5でそのセルを書き換えれば、aを通して読んでも当然新しい値が見えます。Haskellの値そのものは不変(immutable)ですが、IORefが指すセルの中身は可変(mutable)であり、その参照はCのポインタのようにいくらでも共有できる、という点が今回の要点です。