我有一个可扩展的乙烯基/复合记录(类似于 HList、Frames...),我想生成键/值的元组,例如
tuplify '[String :-> Whatevs, ...] :: [(String, String)]
这出乎意料地难。原主旨。
type FA = "a" :-> String
type FB = "b" :-> Int
type AB = '[FA, FB]
ab :: Rec Identity AB
ab = "A" :*: 1 :*: RNil
tuplify :: (Show a) => Rec Identity '[a] -> [(String, String)]
tuplify = recordToList . rmap undefined -- ??????
-- tuplify ab = [("a", "A"), ("b", "1")]
如果您想尝试一下我到目前为止所做的事情,请查看gist,它有经过深思熟虑的示例和我看到的错误:
这是 Composite ( reifyDicts
) 中用于重新编译的硬件:
AFAICT,问题在于rmap
:
rmap :: (forall x. f x -> g x) -> Rec f rs -> Rec g rs
映射的 fn 已定义forall x
,但 mytuplify
受到约束,我认为具体化应该将约束移动到类型中(这就是Dict
s 的用途),但是,唉,到目前为止还没有运气。