Namaran

Code daily. Without assist.

2026-09-12

Total.hs

main :: IO ()
main = do
  let total = 0 :: Int
  total = total + 10
  total = total + 20
  print total

1020を足し合わせて30を出力するつもりですが、これはコンパイルできません。原因を特定し、直してください。

Answer

原因はtotal = total + 10を、他の言語のような「変数への再代入」のつもりで書いていることです。Haskellのlet total = 0は不変な束縛であり、doブロックの中でletを伴わずに=だけを書いても代入文にはならず、構文エラーになります。ここで本当にやりたいのは「同じ入れ物を後から書き換える」ことなので、Data.IORefで明示的に可変な参照を作るのが直し方です。

import Data.IORef

main :: IO ()
main = do
  totalRef <- newIORef (0 :: Int)
  modifyIORef' totalRef (+ 10)
  modifyIORef' totalRef (+ 20)
  total <- readIORef totalRef
  print total