警告说,即使它是模式防护也不是详尽无遗的

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

Yur*_*ras 26

有一张很长的10年.基本上:ghc中的详尽检查正在等待英雄.

补充:问题今天已经结束.我刚检查过,代码不再产生非详尽的警告.希望它将成为其中的一部分ghc-8.0.