我有一个类,它为类型提供全局唯一标识符:
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
感到好奇。
答案 0 :(得分:1)
到目前为止,使用Generics获取软件包名称是不可能的。现在有一个GHC feature request -ticket。这很容易实现,但让我们看看补丁何时发布版本。