我努力了
map show . mapMaybe fromDynamic $ [toDyn "one", toDyn (\x -> x::Integer), toDyn 3, toDyn ()]
但它回来了
["()"]
我努力了
map show . mapMaybe fromDynamic $ [toDyn "one", toDyn (\x -> x::Integer), toDyn 3, toDyn ()]
但它回来了
["()"]
问题是fromDynamic
必须去一个单态类型。它正在采摘()
,但使用类型签名,您可以让它选择任何其他类型。
为了展示它,您需要一些函数来依次尝试所有可能的类型。可能您不想像这样存储数据,而是希望将其与一些操作(例如显示)捆绑在一起存储。
有两种方法可以捆绑。我最喜欢的是将所有功能预先应用于该值(因此,为了展示,您只需获得 type 的 thunk 列表String
)。
另一种方法是将函数也放入 a Dynamic
(确保它们是正确的单态类型!),然后使用dynApply
.
您的代码没有按照您的预期执行。早在动态行为Data.Dynamic
开始之前,Haskell 类型检查器就会解析类型。表达式右侧部分的类型是
mapMaybe fromDynamic $ [toDyn "one", toDyn (\x -> x::Integer), toDyn 3, toDyn ()] :: Typeable b => [b]
左边的类型是
map show :: Show a => [a] -> [String]
所以结合这些,类型变量b
resp。a
得到统一。如果你从一个常规的 Haskell 文件编译它,编译器会给你一个警告(The type variable `a' is ambigous
)。但在 GHCi 中,解释器默认为()
.
但这会将fromDynamic
表达式中的类型固定为Dynamic -> Maybe ()
,从而有效地选择类型的所有元素()
。
如果您强制编译器在那里使用不同的类型,例如通过指定类型签名,您会看到fromDynamic
选择了不同的类型:
Prelude Data.Dynamic Data.Maybe> map (show :: Integer -> String) . mapMaybe fromDynamic $ [toDyn "one", toDyn (\x -> x::Integer), toDyn 3, toDyn ()]
["3"]
不幸的是,没有办法实现您想要的:选择类型支持显示实例的所有元素,因为该信息不适用于fromDynamic
.