2026-09-14
EarlyReturn.hs
import Control.Monad (forM_, when)
main :: IO ()
main = do
forM_ [1 .. 3 :: Int] $ \i -> do
when (i == 2) (return ())
print i
putStrLn "done"
これは何を出力するでしょうか?
Answer
1・2・3・doneをそれぞれ1行ずつ。Haskellのreturnは制御構文ではなく、「値を包むだけで何もしないアクション」を作る普通の関数です。when (i == 2) (return ())はそのアクションを実行して結果を捨てるだけなので、ループ本体を抜けることもループを止めることもなく、次のprint iへ進みます。途中で抜けたいなら、ifで残りの処理をelse側に置くか、再帰で書く必要があります。