Namaran

Code daily. Without assist.

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.Monadwhenを使うのが定番です:

import Control.Monad (when)

warn :: Int -> IO ()
warn n = do
  when (n < 0) $
    putStrLn "negative!"
  putStrLn ("value: " ++ show n)

when自体も、条件が偽なら何もしないアクションreturn ()を返すだけの普通の関数です。else return ()を書き足しても直ります。