Предупреждение о том, что шаблон защиты не является исчерпывающим, хотя это
Я наблюдаю интересное поведение при использовании сопоставления с шаблоном и защитой от шаблонов, и все предупреждения включены
{-# OPTIONS_GHC -Wall #-}
module Mood where
data Mood = Happy
| Indifferent
| Sad
deriving Show
flipMood :: Mood -> Mood
flipMood Happy = Sad
flipMood Indifferent = Indifferent
flipMood Sad = Happy
flipMood' :: Mood -> Mood
flipMood' mood
| Happy <- mood = Sad
| Indifferent <- mood = Indifferent
| Sad <- mood = Happy
Даже если flipMood
а также flipMood'
в значительной степени делают то же самое, я получаю следующее сообщение об ошибке:
Mood.hs:15:1: Warning:
Pattern match(es) are non-exhaustive
In an equation for ‘flipMood'’: Patterns not matched: _
Ok, modules loaded: Mood.
и поэтому нужно добавить поймать все дела, как
| otherwise = mood
чтобы удовлетворить проверки исчерпывающего.
Ядро, кажется, просто отлично с этими двумя функциями, ведущими одинаково:
flipMood =
\ ds_dTh ->
case ds_dTh of _ {
Happy -> Sad;
Indifferent -> Indifferent;
Sad -> Happy
}
flipMood' = flipMood
С выключенными оптимизациями я получаю следующий вывод Core, который, кажется, объясняет это поведение:
flipMood' =
\ mood_axV ->
case mood_axV of wild_X9 {
__DEFAULT ->
case wild_X9 of _ {
Indifferent -> Indifferent;
Sad -> Happy
};
Happy -> Sad
}
Почему так себя ведет? Я что-то пропустил?
С уважением, Райчу
1 ответ
Об этом есть длинный 10-летний билет. В основном: исчерпывающая проверка в ghc ждет героя.
Добавлено: Вопрос был закрыт сегодня. Я только что проверил, код больше не выдает неисчерпывающее предупреждение. Надеюсь, это будет частью ghc-8.0
,