私はこのタイプとこれらの機能を持っています:
data Tag a where
Tag :: (Show a, Eq a, Ord a, Storable a, Binary a) => a -> BL.ByteString -> Tag a
getVal :: Tag a -> a
getVal (Tag v _) = v
isBigger :: Tag a -> Tag a -> Bool
a `isBigger` b = (getVal a) > (getVal b)
コードは型チェックを行いません:
No instance for (Ord a)
arising from a use of `>'
In the expression: (getVal a) > (getVal b)
In an equation for `isBigger':
a isBigger b = (getVal a) > (getVal b)
しかし、なぜそうしないのか理解できません。Tag a
にはコンテキストがあり(Show a, Eq a, Ord a, Storable a, Binary a)
、getVa
このコンテキストを保持する必要があります。私のやり方が間違っているのでしょうか、それとも GADTs 拡張機能の制限ですか?
これは機能します:
isBigger :: Tag a -> Tag a -> Bool
(Tag a _) `isBigger` (Tag b _) = a > b
編集:例を最小限の例に変更しました
編集: わかりました、なぜこのタイプチェックをしないのですか?
isBigger :: Tag a -> Tag a -> Bool
isBigger ta tb =
let (Tag a _) = ta
(Tag b _) = tb
in
a > b