8

次のコードがあります

{-# LANGUAGE DataKinds, GADTs, TypeOperators #-}

data Vect v a where
    Nil :: Vect '[] a
    Vec :: a -> Vect v a -> Vect (() ': v) a 

instance Eq a => Eq (Vect v a) where
    (==) Nil Nil               = True
    (Vec e0 v0) == (Vec e1 v1) = e0 == e1 && v0 == v1

コンパイルまたは解釈すると-Wall、次の警告が表示されます。

Pattern match(es) are non-exhaustive
In an equation for `==':
    Patterns not matched:
        Nil (Vec _ _)
        (Vec _ _) Nil

通常、これは予想されることです。通常、パターンが考えられるすべてのケースをカバーすると推論できたとしても、コードを実行せずにコンパイラーがそれを知る方法はありません。ただし、提供されたパターンの網羅性は、コンパイル時に実行される型チェッカーによって適用されます。GHC によって提案されたパターンを追加すると、コンパイル時にエラーが発生します。

Couldn't match type '[] * with `(':) * () v1'

私の質問はこれです: GHC の警告は GHC の拡張機能とうまく機能しませんか? 彼らはお互いを認識しているはずですか?この機能 (拡張機能を考慮した警告) は将来のリリースで予定されていますか? または、この機能の実装に技術的な制限はありますか?

解決策は単純なようです。コンパイラは、おそらく一致しないパターンを関数に追加し、提案されたパターンが適切に型付けされているかどうかを型チェッカーに再度問い合わせることができます。そうである場合は、実際にパターンの欠落としてユーザーに報告できます。

4

1 に答える 1