Подтвердить что ты не робот

Предупреждение о том, что защита рисунка не является исчерпывающей, даже если она

Я наблюдаю интересное поведение при использовании сопоставления с шаблонами и всех предупреждений, включенных

{-# 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.

и, следовательно, необходимо добавить catch для всех случаев, таких как

| 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
    }

Почему это так? Я что-то пропустил?

С уважением, raichoo

4b9b3361

Ответ 1

Существует длинный 10-летний ticket об этом. В принципе: исчерпывающая проверка в ghc ждет героя.

Добавлено: Проблема была закрыта сегодня. Я только что проверил, код больше не выводит не исчерпывающее предупреждение. Надеюсь, это будет часть ghc-8.0.