2026-09-15
Warn.hs
warn :: Int -> IO ()
warn n = do
if n < 0
then putStrLn "negative!"
putStrLn ("value: " ++ show n)
負の値のときだけ警告を出してから値を表示するつもりですが、コンパイルできません。何が問題で、どう直せばよいでしょうか?
Answer
Haskellのifは文ではなく、常に値を持つ式なので、elseは省略できません(doの中でも同じで、構文エラーになります)。「条件が成り立つときだけアクションを実行する」には、Control.Monadのwhenを使うのが定番です:
import Control.Monad (when)
warn :: Int -> IO ()
warn n = do
when (n < 0) $
putStrLn "negative!"
putStrLn ("value: " ++ show n)
when自体も、条件が偽なら何もしないアクションreturn ()を返すだけの普通の関数です。else return ()を書き足しても直ります。