Из вашего вопроса:
Я прочитал, что мы должны всегда вызывать wait () из цикла:
blockquote>Хотя wait () обычно до тех пор, пока не будет вызвана notify () или notifyAll (), существует вероятность, что в очень редких случаях ожидание потока может быть пробуждено из-за ложного пробуждения. В этом случае поток ожидания возобновляется без уведомления () или notifyAll (), который был вызван.
По сути, поток возобновляется без видимых причин.
Из-за этой удаленной возможности , Oracle рекомендует, чтобы вызовы wait () должны выполняться в цикле, который проверяет условие ожидания потока.
Ну, я предполагаю, что это означает, что это говорит о том, что шаблон не соответствует, но нет альтернативы. Этот пример:
Но для программы:
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
.
Рассмотрим этот пример:
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 .
Чтобы добавить то, что сказали другие, вы можете получить его технически, если отключите список, который меньше, чем вы предполагаете. Например (в 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)