Что вызывает «неопровержимый шаблон не для шаблона» и что это значит? - PullRequest
23 голосов
/ 15 июля 2011

Что означает

неопровержимый шаблон для шаблона

?Какие случаи вызовут эту ошибку во время выполнения?

Ответы [ 3 ]

20 голосов
/ 15 июля 2011

Рассмотрим этот пример:

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 .

20 голосов
/ 15 июля 2011

Ну, я предполагаю, что это означает, что это говорит - что шаблон не соответствует, но нет альтернативы.Этот пример:

Но для программы:

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.

8 голосов
/ 05 мая 2014

Чтобы добавить то, что сказали другие, вы можете получить его технически, если отключите список, который меньше, чем вы предполагали.Например (в 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)
...