Namaran

Code daily. Without assist.

2026-09-12

MutableCounter.hs

import Data.IORef

main :: IO ()
main = do
  ref <- newIORef (0 :: Int)
  modifyIORef' ref (+ 5)
  modifyIORef' ref (* 3)
  final <- readIORef ref
  print final

これは何を出力するでしょうか?

Answer

15です。Haskellのletや関数の引数といった普通の束縛は不変で、一度決めた値を後から書き換えることはできません。本当に「同じ入れ物の中身を順番に更新したい」ときは、Data.IORefのような明示的な可変参照を使います。newIORef0を入れた箱を作り、modifyIORef' ref (+ 5)で中身を5に、続くmodifyIORef' ref (* 3)15に更新してからreadIORefで読み出しています。可変にしたい値だけをこうして明示的に選ぶのが、Haskellでの「使い分け」です。