2011-07-26 2 views
3

Может ли кто-нибудь указать мне хороший набор примеров для определения экземпляров Typeable или Typeable1 для GADT в Haskell.Определение собственных экземпляров Typeable для GADT

Или может кто-то просто показать мне, как определить Typeable (вручную) для следующего GADT.

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 

Альтернативно указатель на бумагу, в которой была представлена ​​идея, также будет полезной.

ответ

7

Похоже, сайт уже нет, но Вайбак машина все еще имеет место, что ссылки на все оригинальные работы: 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.