【发布时间】:2017-08-03 02:07:07
【问题描述】:
我有一个可扩展的 Vinyl / Composite 记录(类似于 HList、Frames...),我想生成键/值的元组,例如
tuplify '[String :-> Whatevs, ...] :: [(String, String)]
这非常困难。 original gist.
Solution Gist, thanks to Alec below
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): 中重新生成的硬件
乙烯基(reifyConstraints):也是如此
AFAICT,问题在于rmap:
rmap :: (forall x. f x -> g x) -> Rec f rs -> Rec g rs
映射的 fn 定义为 forall x,但我的 tuplify 受到约束,我认为具体化应该将约束移动到类型中(这就是 Dicts 的用途),但是,唉,没有运气所以远。
【问题讨论】:
-
您是否避免使用
reifyNames? (这似乎已经为这种事情做好了准备......)
标签: haskell types hlist extensible vinyl