2015-02-11 33 views
21

Ja obserwując ciekawy wzór zachowań podczas korzystania z osłon dopasowanie wzoru i wszystkie ostrzeżenia włączonyostrzeżenie, że straż wzór nie jest wyczerpująca, mimo że jest

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

Nawet flipMood i flipMood' są dość dużo robi samo pojawia się następujący komunikat o błędzie:

Mood.hs:15:1: Warning: 
    Pattern match(es) are non-exhaustive 
    In an equation for ‘flipMood'’: Patterns not matched: _ 
Ok, modules loaded: Mood. 

i dlatego trzeba dodać złapać wszystkie sprawy jak

| otherwise = mood 

w celu spełnienia sprawdzenia kompletności.

rdzeń wydaje się być w porządku ze te dwie funkcje zachowuje się tak samo:

flipMood = 
    \ ds_dTh -> 
    case ds_dTh of _ { 
     Happy -> Sad; 
     Indifferent -> Indifferent; 
     Sad -> Happy 
    } 

flipMood' = flipMood 

Dzięki optymalizacji wyłączony uzyskać następujące wyjście rdzeń, który wydaje się wyjaśnić to zachowanie:

flipMood' = 
    \ mood_axV -> 
    case mood_axV of wild_X9 { 
     __DEFAULT -> 
     case wild_X9 of _ { 
      Indifferent -> Indifferent; 
      Sad -> Happy 
     }; 
     Happy -> Sad 
    } 

Dlaczego czy zachowuje się w ten sposób? Czy czegoś brakuje?

pozdrowienia rodzaju, raichoo

Odpowiedz

26

Istnieje długa 10-letni ticket o tym. Zasadniczo: czeka na bohatera wyczerpujące sprawdzanie w ghc.

Dodano: Emisja została dzisiaj zamknięta. Właśnie sprawdziłem, kod już nie generuje niewyczerpującego ostrzeżenia. Mam nadzieję, że będzie to część ghc-8.0.

+0

To chyba wyjaśnia rzeczy :) – raichoo

Powiązane problemy