问问题
144 次
1 回答
5
你是正确的,reifyConstraint 将解决这个问题。该函数所做的是将(或“具体化”)约束转换为数据类型,即Dict
数据类型。例如
>:t reifyConstraint (Proxy :: Proxy Show) mytuple
(reifyConstraint (Proxy :: Proxy Show) mytuple)
:: Rec (Dict Show :. Identity) '[Integer, Bool]
此记录中的每个元素都将具有 form Dict (Identity _)
。Dict
定义为
data Dict c x where Dict :: c x => x -> Dict c x
(Dict Show :. Identity) a
现在您只需要一个可以将 a作为输入处理的遍历函数。
printi :: Compose (Dict Show) Identity a -> IO (Compose (Dict Show) Identity a)
printi x@(Compose (Dict a)) = print a >> return x
请注意,您不需要Show
约束a
-Show
类字典存储在Dict
数据类型中。您可以使用此功能进行遍历。
main = rtraverse printi (reifyConstraint (Proxy :: Proxy Show) mytuple)
于 2015-04-05T14:40:12.263 回答