2026-08-22
SafeDivide.hs
safeDivide :: Int -> Int -> Maybe Int
safeDivide _ 0 = Nothing
safeDivide a b = Just (a `div` b)
describe :: Int -> Int -> String
describe a b =
let Just result = safeDivide a b
in "Result: " ++ show result
describe 10 0はクラッシュします。何が問題で、どう直せばよいでしょうか?
Answer
let Just result = safeDivide a bは、反駁不可能パターン(irrefutable pattern)としてJust resultにマッチさせようとしています。safeDivide a bがNothingを返すと、このパターンマッチは実行時に失敗してクラッシュします。case式で両方のケースを扱うようにしてください: case safeDivide a b of Just result -> ...; Nothing -> ...。