Причины, по которым «неопровержимый шаблон» не удалось использовать шаблону, rdquo; и что это значит?

Из вашего вопроса:

Я прочитал, что мы должны всегда вызывать wait () из цикла:

Хотя wait () обычно до тех пор, пока не будет вызвана notify () или notifyAll (), существует вероятность, что в очень редких случаях ожидание потока может быть пробуждено из-за ложного пробуждения. В этом случае поток ожидания возобновляется без уведомления () или notifyAll (), который был вызван.

По сути, поток возобновляется без видимых причин.

Из-за этой удаленной возможности , Oracle рекомендует, чтобы вызовы wait () должны выполняться в цикле, который проверяет условие ожидания потока.

23
задан Will Ness 24 December 2017 в 17:06
поделиться

3 ответа

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

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

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.

20
ответ дан Cactus 24 December 2017 в 17:06
поделиться

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

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
ответ дан Community 24 December 2017 в 17:06
поделиться

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

Похожие вопросы: