2026-09-12
Total.hs
main :: IO ()
main = do
let total = 0 :: Int
total = total + 10
total = total + 20
print total
10と20を足し合わせて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