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
即使flipMood
和flipMood'
是幾乎做同樣的事情,我收到以下錯誤信息:
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
我想這解釋的東西:) – raichoo 2015-02-11 13:04:20