私は Haskell で GADT の概念を取り上げようとしていて、Peano Number のシナリオに従おうとしていました。
{-# LANGUAGE GADTs, KindSignatures, DataKinds #-}
module Data.GADTTest where
data Height = Zero | Inc Height deriving (Show, Eq)
data TestGADT :: Height -> * where
TypeCons1 :: TestGADT Zero
TypeCons2 :: Int -> TestGADT h -> TestGADT (Inc h)
testFunc :: TestGADT h -> TestGADT h -> Int
testFunc TypeCons1 TypeCons1 = 1
testFunc (TypeCons2 {}) (TypeCons2 {}) = 2
しかし、これを-fwarn-incomplete-patterns
フラグ (GHC-7.6.3) でコンパイルすると、考えられるすべてのパターンが用意されているにもかかわらず、次の警告が表示されます。
Pattern match(es) are non-exhaustive
In an equation for `testFunc':
Patterns not matched:
TypeCons1 (TypeCons2 _ _)
(TypeCons2 _ _) TypeCons1
ただし、これらのパターンのいずれかに一致するものを含めると、次のようになります。
testFunc TypeCons1 (TypeCons2 {}) = 3
コンパイラは(正しくそうです)私に次のエラーを与えます:
Couldn't match type 'Zero with 'Inc h1
Inaccessible code in
a pattern with constructor
TypeCons2 :: forall (h :: Height).
Int -> TestGADT h -> TestGADT ('Inc h),
in an equation for `testFunc'
In the pattern: TypeCons2 {}
In an equation for `testFunc':
testFunc TypeCons1 (TypeCons2 {}) = 3
基本的にこの関数のフラグを役に立たなくし、余分な醜いジャンクでコードを混乱させるtestFunc _ _ = undefined
行を追加せずに、この関数またはデータ型を記述する方法はありますか?warn-incomplete-patterns