2015-02-11 72 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