繁体   English   中英

转换为类型类

[英]Casting to a typeclass

我想实现一个泛型函数,它将尝试将任何类型转换为列表。 我试图在Typeable的帮助下实现这一Typeable

import Data.Data
import Data.Foldable
import Control.Applicative

asFoldable :: (Typeable (a b), Foldable z, Typeable (z b)) => a b -> Maybe (z b)
asFoldable = cast

asList :: (Typeable1 a, Typeable b) => a b -> Maybe [b]
asList x = Data.Foldable.foldr (:) [] <$> asFoldable x

上面的代码在没有asList定义的情况下也可以正常编译,但是有了它,它就一直asListt0类型变量的模棱两可,我指的是a 现在,我尝试了一些技巧,但是只有当我为演员表指定特定类型(例如Maybe [String]Maybe (Set String)Maybe (Set String) ,它才有效。

我的猜测是我必须用asFoldable类型声明来欺骗编译器,但是它仍然无法正常工作,因为它不支持类型转换。 这是真的? 有没有更好的方法尝试将任何类型转换为列表? 有没有?

没有方法(没有Template Haskell,这几乎总是过大),无法动态测试类型类实例的存在。 以通用方式将任意结构转换为其他任意结构的正确方法是使用Data.Data ,这是@hammar在另一个问题中谈到的通用类型。

toTree :: Data a => a -> Tree String
toTree x = Node (show $ toConstr x) $ gmapQ toTree x

当然,正如@hammar也说过的那样,您可能希望对列表和字符串进行不同的处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM