Что приводит к тому, что "неопровержимая картина не удалась для шаблона" и что это значит?
Что делает
неопровержимый шаблон не найден для шаблона
означает?
В каких случаях эта ошибка будет выполняться?
Ответы
Ответ 1
Хорошо, я предполагаю, что это означает, что он говорит - что шаблон не соответствует, но альтернативы нет. Этот пример:
Но для программы:
g x = let Just y = f x in h y
Отчеты GHC:
Main: M1.hs:9:11-22:
Irrefutable pattern failed for pattern Data.Maybe.Just y
Указание источника отказа.
Поставляется из http://www.haskell.org/haskellwiki/Debugging
Точка примера состоит в том, что если f x
возвращает Nothing
, тогда GHC не может присвоить значение y
.
Ответ 2
Рассмотрим следующий пример:
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.
Ответ 3
Чтобы добавить то, что сказали другие, вы можете технически получить его, если вы отключите список, который меньше, чем вы планируете. Например (в GHCi):
Prelude> let l = [1,2,3]
Prelude> let (x:x1:xs) = l
Prelude> x
1
Работает нормально, но если вы это сделали:
Prelude> let l2 = [1]
Prelude> let (x:x1:xs) = l2
Prelude> x
*** Exception: <interactive>:294:5-18: Irrefutable pattern failed for pattern (x : x1 : xs)