sinonimo rae exhaustivos exhaustivo conflictos haskell pattern-matching pattern-guards

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 .