Рассмотрим этот пример:
foo ~(Just x) = "hello"
main = putStrLn $ foo Nothing
При этом используется неопровержимый образец (часть ~
).Неопровержимые паттерны всегда «совпадают», поэтому это печатает hello
.
foo ~(Just x) = x
main = putStrLn $ foo Nothing
Теперь паттерн все еще совпадает, но когда мы попытались использовать x
, когда его там не было, мы получилинеопровержимая ошибка сопоставления с шаблоном:
Irr.hs: /tmp/Irr.hs:2:1-17: Irrefutable pattern failed for pattern (Data.Maybe.Just x)
Это незначительно отличается от ошибки, получаемой при отсутствии соответствующего шаблона:
foo (Just x) = x
main = putStrLn $ foo Nothing
Вывод
Irr.hs: /tmp/Irr.hs:2:1-16: Non-exhaustive patterns in function foo
Конечно, это несколько надуманный пример.Более вероятное объяснение состоит в том, что оно пришло из шаблона в привязке let
, , как подсказал chrisdb .