(String,String,String) -- (Package, Module, -6ren">
gpt4 book ai didi

haskell - "packageName"与 GHC.Generics

转载 作者:行者123 更新时间:2023-12-02 03:29:15 25 4
gpt4 key购买 nike

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

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 很好奇。

最佳答案

到目前为止,使用泛型是不可能得到包名的。有一个GHC feature request -ticket现在。实现起来很简单,但让我们看看补丁何时登陆发布版本。

关于haskell - "packageName"与 GHC.Generics,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28159068/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com