"packageName" с GHC.Generics

У меня есть класс, который предоставляет глобально уникальный идентификатор для типов:

class Named a where
 nameOf :: a -> (String,String,String) -- (Package, Module, Identifier)
 default nameOf :: (Generic a, Named' (Rep a)) => a -> (String,String,String)
 nameOf = nameOf' . from

который почти работает:

>>> data D = C
>>> instance Named D
>>> nameOf C
("","Main","D")

но я не могу получить пакет типа данных с GHC.Generics:

class Named' f where  nameOf' :: f a -> (String,String,String)
instance (Datatype t) => Named' (M1 D t f) where nameOf' d = ("", moduleName d, datatypeName d)

Могу я? GUI на самом деле не "глобально" уникален без пакета.

Кстати, я знаю, что с Data.Typeable Я могу написать:

>>> import Data.Typeable
>>> :set -XDeriveDataTypeable
>>> let nameOf = (\t -> (tyConPackage t, tyConModule t, tyConName t)) . typeRepTyCon . typeRep
>>> data D = C deriving Typeable
>>> nameOf (Proxy :: Proxy D)
("interactive" "Ghci3" "D")

Что я могу сделать Но мне интересно GHC.Generics,

1 ответ

Пока что невозможно получить имя пакета, используя Generics. Сейчас есть запрос на добавление GHC. Это было просто реализовать, но давайте посмотрим, когда патч получит релизную версию.

Другие вопросы по тегам