[英]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
定义的情况下也可以正常编译,但是有了它,它就一直asList
着t0
类型变量的模棱两可,我指的是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.