Namaran

Code daily. Without assist.

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

5IORefは値そのものではなく、書き換え可能なセルへの参照です。let b = aaの中身をコピーするのではなく、baと全く同じ参照に束縛するだけなので、abは同じセルを指す別名です。writeIORef b 5でそのセルを書き換えれば、aを通して読んでも当然新しい値が見えます。Haskellの値そのものは不変(immutable)ですが、IORefが指すセルの中身は可変(mutable)であり、その参照はCのポインタのようにいくらでも共有できる、という点が今回の要点です。