Похоже, сайт уже нет, но Вайбак машина все еще имеет место, что ссылки на все оригинальные работы: http://web.archive.org/web/20080622204226/http://www.cs.vu.nl/boilerplate/
В любом случае, печатаемые почти полностью механическим. Вы можете просто получить его, даже для 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. См.: Changes to Data.Typeable.