2015-02-11 23 views
21

我使用模式與模式匹配警衛觀察時,一個有趣的現象,所有的警告開啓警告模式守衛並非詳盡無遺,即使它是

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

即使flipMoodflipMood'是幾乎做同樣的事情,我收到以下錯誤信息:

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 

隨着優化關閉我得到以下核心輸出,這似乎解釋這種現象:

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

爲什麼它是這樣表現嗎?我錯過了什麼嗎?

親切的問候, raichoo

回答

26

還有很長的10歲的ticket有關。基本上:ghc的詳盡檢查正在等待英雄。

加了:這個問題今天就結束了。我剛查過,代碼不再產生非詳盡的警告。希望它會成爲ghc-8.0的一部分。

+0

我想這解釋的東西:) – raichoo 2015-02-11 13:04:20