rai*_*hoo 21 haskell pattern-matching pattern-guards
当使用模式匹配模式匹配并打开所有警告时,我正在观察一个有趣的行为
{-# 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
Run Code Online (Sandbox Code Playgroud)
即使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.
Run Code Online (Sandbox Code Playgroud)
因此需要添加一个捕获所有案例
| otherwise = mood
Run Code Online (Sandbox Code Playgroud)
满足穷举检查.
核心似乎很好,这两个函数表现相同:
flipMood =
\ ds_dTh ->
case ds_dTh of _ {
Happy -> Sad;
Indifferent -> Indifferent;
Sad -> Happy
}
flipMood' = flipMood
Run Code Online (Sandbox Code Playgroud)
关闭优化后,我得到以下Core输出,这似乎可以解释这种行为:
flipMood' =
\ mood_axV ->
case mood_axV of wild_X9 {
__DEFAULT ->
case wild_X9 of _ {
Indifferent -> Indifferent;
Sad -> Happy
};
Happy -> Sad
}
Run Code Online (Sandbox Code Playgroud)
为什么这样做?我错过了什么吗?
亲切的问候,raichoo
| 归档时间: |
|
| 查看次数: |
541 次 |
| 最近记录: |