Почему неполные меры защиты вызывают неопровержимое сопоставление с образцом Ошибка?

У меня есть эта функция в Haskell:

test :: (Eq a) => a -> a -> Maybe a
test a b
  | a == b = Just a
test _ _ = Nothing

Вот что я получил, когда попробовал функцию с разными входами:

ghci>test 3 4
Nothing
ghci>test 3 3
Just 3

Согласно Real World Haskell, первый шаблон неопровержим. Но похоже, что тест 3 4 не дает сбоя в первом шаблоне и соответствует второму. Я ожидал какой-то ошибки - может быть, «неисчерпаемые охранники». Итак, что здесь происходит на самом деле, и есть ли способ включить предупреждения компилятора в случае, если это случайно произойдет?

11
задан Matt Fenwick 16 December 2013 в 18:09
поделиться