ウェブサイトはもうなくなったようですが、ウェイバックマシンには、元のすべての論文にリンクするサイトがまだあります: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 []
NOINLINE
mkTyConは内部で安全でないことを行うため、プラグマは実際に重要です。これが、可能であれば、GHCにインスタンスを手動で派生させるのが最善である理由です。
私の理解では、GHCの将来のバージョンで変更される部分はmkTyCon3
、パッケージ名、モジュール名、および型名を個別の引数として受け取る別の関数を使用する必要があるということです。複数のバージョンのGHCのサポートが難しくなったとしても、これは明らかな改善です。参照:Data.Typeableへの変更。
上記のすべては本当に古いです。
GHCドキュメントから:
また、GHC 7.8.1以降、Typeableの手書き(つまり派生していない)インスタンスは禁止されており、エラーが発生します。
Typeable
最新バージョンのGHCを使用してインスタンスを手動で作成する必要はなく、許可されることもありません。実際、GHCにそれらを導出するように指示する必要さえありません-それは自動的にそれを行います。