これを重複として却下する前に
少なくとも 2018 年 9 月の時点では、GHCI では警告をローカルで無効にすることはできません(ただし、ファイル全体で無効にすることはできます)。
しかし、すべてのケースが実際に処理されていることを GHCI に知らせる別の方法があるのではないでしょうか?
質問
私が時々使用するイディオムは、最初の定義がいくつかの述語をテストして Left を返す関数を記述し、他の定義は操作が実際に意味をなす引数を考慮することです。それを行うたびに、「パターン一致は網羅的ではありません」というエラーが表示されますが、実際にはすべての条件をチェックしています。
例
(このおもちゃの例の動機となっている実際のコードについては、たとえばpExprToHExpr
hereの定義を参照してください。)
このコード:
{-# LANGUAGE ViewPatterns #-}
data Cowbell = Cowbell
deriving Show
data Instrument = Rattle
| Drums (Maybe Cowbell)
| Violin
| Oboe
deriving Show
pitched :: Instrument -> Bool
pitched Rattle = False
pitched (Drums Nothing) = False
pitched (Drums (Just Cowbell)) = True
pitched Violin = True
pitched Oboe = True
highestPitch :: Instrument -> Either String Float
highestPitch i@(pitched -> False) =
Left $ "Instrument " ++ show i ++ " has no pitch."
highestPitch (Drums (Just Cowbell)) = Right 800
highestPitch Violin = Right 5000
highestPitch Oboe = Right 2000
次のエラーが生成されます。
example.hs:19:1: warning: [-Wincomplete-patterns]
Pattern match(es) are non-exhaustive
In an equation for ‘highestPitch’:
Patterns not matched:
Rattle
(Drums Nothing)
他の条件下では、Instrument
タイプを細分化します。
data Percussive = Rattle | Drums
data Pitched = Violin | Oboe
data Instrument = Percussive Percussive
| Pitched Pitched
しかし (この架空の物理学では) のセットは、Drums
が含まれている場合、最高のピッチを持つ可能性があるため、 タイプまたはタイプCowbell
のいずれにも適合しません。Percussive
Pitched