2026-09-14
While.hs
import Control.Monad (when)
while :: IO Bool -> IO () -> IO ()
while cond body = undefined -- write this: run body repeatedly while cond yields True
condがTrueを返す間、bodyを繰り返し実行するwhileを書いてください。
Reference
while :: IO Bool -> IO () -> IO ()
while cond body = do
ok <- cond
when ok $ do
body
while cond body
condは「一度だけ計算済みのBool」ではなく「実行するたびにBoolを返すアクション」という値なので、同じcondを毎周実行し直せば、そのたびに最新の状態を読めます。bodyも同様です。ループ構文がなくても、アクションを引数に取る普通の再帰関数で制御構造そのものを書けます。これは参考実装であり、唯一の正解ではありません。