是否可以创建一个包含属于Show
类型的值的列表?
这与Scala中的List[Showable]
类似,其中Showable
是一个特征。
通过这种方式,可以将Int
和String
放入相同的列表中。
这可能吗?如果是,怎么样?
答案 0 :(得分:13)
有可能:
{-# LANGUAGE GADTs #-}
data Showable where Showable :: Show a => a -> Showable
foo = [Showable 3, Showable "foo", Showable ()]
但我可以建议您使用[String]
,或者如果您真的需要[Int -> ShowS]
的{{1}},可能会使用showsPrec
,因为您可以使用这样的列表来展示所有内容内?
foo' = [show 3, show "foo", show ()]
答案 1 :(得分:6)
您可以使用existential types
执行此操作data ShowBox = forall s. Show s => SB s
heteroList :: [ShowBox]
heteroList = [SB "Hello world", SB 5, SB 1]
您可以对此列表中的项目执行的唯一操作是show
:
let strings = fmap (\(SB b) -> show b) heteroList