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