如何解决如何在 purescript 中获取产品类型的构造函数名称?类似于 haskell conNameOf
我想为我的数据提取构造函数的值,该值是产品类型 data X = Xa A | Xb B | Xcd C D | Xefg E F G....
的总和,其中 A B C... 属于 data A = A {a :: xyz,b :: abc..}
类型
我想要一个函数,它接受一个类型为 X 的值并根据类型给我 "Xa","Xb" ..。我知道我可以使用 case 但有没有更好的方法来做到这一点?为此,Haskell 有 toConstr 函数,
解决方法
我认为标准库中没有函数,但如果您不介意使用 RTTI 机制(这是 conNameOf
使用的),您可以相对轻松地使用 { {3}}:只需使用 from
将值转换为其通用表示,然后通过匹配 Generic
和 Sum
来提取构造函数:
class ConstrName rep where
constrName' :: rep -> String
instance IsSymbol name => ConstrName (Constructor name a) where
constrName' (Constructor _) = reflectSymbol (Proxy :: Proxy name)
instance (ConstrName a,ConstrName b) => ConstrName (Sum a b) where
constrName' (Inl a) = constrName' a
constrName' (Inr b) = constrName' b
constrName :: forall a rep. Generic a rep => ConstrName rep => a -> String
constrName a = constrName' $ from a
用法:
> constrName (Xa $ A { a: ...,b: ...,.... })
"Xa"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。