繁体   English   中英

与GHC.Generics合作的“packageName”

[英]“packageName” with 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感到好奇。

到目前为止,使用Generics获取软件包名称是不可能的。 现在有一个GHC功能请求 - 票据 这很容易实现,但让我们看看补丁何时发布版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM