【发布时间】:2018-04-10 02:29:42
【问题描述】:
我的目标是编写带有一些多态值和列表的函数,其中 typereps 表示具体类型。它返回具有相同值但已转换为通过 typereps 指定的具体类型的新列表。
让我们有这样的值列表:["one", "two"] 启用 -XOverloadedStrings。
分别为IsString a => a。
我们可以通过这种方式获得的 typerep 列表:
import Data.Typeable (Proxy(..), typeRep)
import Data.Text (Text)
[typeRep (Proxy :: Proxy String), typeRep (Proxy :: Proxy ByteString)]
有什么方法可以得到String 类型的"one" 和ByteString 类型的"two"?
附:为了防止根据包含不同类型值的列表出错,我们可以将每个值包装在Dynamic.中,如下例(伪代码):
{-# LANGUAGE ParallelListComp #-}
import Data.Dynamic (toDyn)
[ toDyn (val :: type') | val <- vals | type' <- concreteTypes ]
用Haskell模板也可以,但是太丑了。
【问题讨论】:
-
结果列表的类型是什么?使用新的反射机制可能会发生这样的事情,但您至少需要返回一个 HList。
-
一个列表只能包含一种类型的元素。
-
@WillemVanOnsem 已编辑。
-
@Alec 在我的情况下,它应该稍后变成动态的。
标签: haskell dynamic types polymorphism generic-programming