5

Haskell で GADT の Typeable または Typeable1 インスタンスを定義するための良い例を教えてください。

または、誰かが次の GADT の Typeable を (手動で) 定義する方法を示すことができますか?

data V a where
    Unit :: V () 
    Pair :: V a -> V b -> V (a, b) 
    L :: V a -> V (Either a b) 
    R :: V b -> V (Either a b) 
    Fresh :: Int -> V a

あるいは、そのアイデアを紹介した論文へのポインタも役立ちます。

4

1 に答える 1

8

ウェブサイトはもうなくなったようですが、ウェイバックマシンには、元のすべての論文にリンクするサイトがまだあります:http: //web.archive.org/web/20080622204226/http ://www.cs.vu.nl/ボイラープレート/

いずれにせよ、Typeableはほぼ完全に機械的です。GADTの場合でも、DeriveDataTypeable拡張機能を使用して派生させることができます。少なくとも* -> *、あなたの例のように、種類がである場合。

Typeable1インスタンスを手動で提供する例を示すこともできますが、GHCの次のバージョンでは非推奨になります。手作業でインスタンスを作成するために使用されるインターフェースが変更されています。

{-# NOINLINE vTyCon #-}
vTyCon :: TyCon
vTyCon = mkTyCon "ModuleName.V"

instance Typeable1 V where
    typeOf1 _ = mkTyConApp vTyCon []

NOINLINEmkTyConは内部で安全でないことを行うため、プラグマは実際に重要です。これが、可能であれば、GHCにインスタンスを手動で派生させるのが最善である理由です。

私の理解では、GHCの将来のバージョンで変更される部分はmkTyCon3、パッケージ名、モジュール名、および型名を個別の引数として受け取る別の関数を使用する必要があるということです。複数のバージョンのGHCのサポートが難しくなったとしても、これは明らかな改善です。参照:Data.Typeableへの変更

上記のすべては本当に古いです。

GHCドキュメントから:

また、GHC 7.8.1以降、Typeableの手書き(つまり派生していない)インスタンスは禁止されており、エラーが発生します。

Typeable最新バージョンのGHCを使用してインスタンスを手動で作成する必要はなく、許可されることもありません。実際、GHCにそれらを導出するように指示する必要さえありません-それは自動的にそれを行います。

于 2011-07-26T17:11:38.277 に答える