3

これを重複として却下する前に

少なくとも 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のいずれにも適合しません。PercussivePitched

4

2 に答える 2