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

網羅性チェッカーを満たすために。

コアは、これらの 2 つの関数が同じように動作するだけで問題ないようです。

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
    }

なぜこのように振る舞うのですか?何か不足していますか?

よろしく、雷鳥

4

1 に答える 1

27

それについては、10 年前の長いチケットがあります。基本的に: ghc での徹底的なチェックがヒーローを待っています。

追加:本日、この問題はクローズされました。チェックしたところ、コードは非網羅的な警告を生成しなくなりました。の一部になることを願っていますghc-8.0

于 2015-02-11T13:02:25.180 に答える