"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. Это было просто реализовать, но давайте посмотрим, когда патч получит релизную версию.