haskell - exhaustivos - exhaustivo rae
Advirtiendo que el patrón de protección no es exhaustivo a pesar de que es (1)
Estoy observando un comportamiento interesante al usar la coincidencia de patrones con protectores de patrones y todas las advertencias activadas
{-# 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
Aunque flipMood
y flipMood''
están haciendo prácticamente lo mismo, flipMood''
el siguiente mensaje de error:
Mood.hs:15:1: Warning:
Pattern match(es) are non-exhaustive
In an equation for ‘flipMood''’: Patterns not matched: _
Ok, modules loaded: Mood.
Y por lo tanto hay que añadir una captura de todos los casos como
| otherwise = mood
Para satisfacer el comprobador de exhaustividad.
El núcleo parece estar bien con estas dos funciones que se comportan igual:
flipMood =
/ ds_dTh ->
case ds_dTh of _ {
Happy -> Sad;
Indifferent -> Indifferent;
Sad -> Happy
}
flipMood'' = flipMood
Con las optimizaciones desactivadas, obtengo la siguiente salida Core que parece explicar este comportamiento:
flipMood'' =
/ mood_axV ->
case mood_axV of wild_X9 {
__DEFAULT ->
case wild_X9 of _ {
Indifferent -> Indifferent;
Sad -> Happy
};
Happy -> Sad
}
¿Por qué se comporta de esta manera? ¿Me estoy perdiendo de algo?
Saludos cordiales, raichoo
Hay un ticket largo de 10 años sobre eso. Básicamente: el control exhaustivo en ghc está esperando al héroe.
Agregado: El tema fue cerrado hoy. Acabo de verificar, el código ya no produce una advertencia no exhaustiva. Esperemos que sea parte de ghc-8.0
.