3

我有一个为类型提供全局唯一标识符的类:

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

4

1 回答 1

1

到目前为止,使用泛型获取包名是不可能的。现在有一个GHC 功能请求票。实现起来很简单,但让我们看看补丁什么时候发布版本。

于 2015-01-27T18:04:42.230 回答