我有一个可扩展的乙烯基/复合记录(类似于HList,帧...),并且我想生成密钥/值的元组,如如何约束乙烯基/复合记录?
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,它具有良好的深思熟虑的例子,我看到了错误:
这里是复合(reifyDicts
):
的硬件refying与同为乙烯(reifyConstraints
):
AFAICT,问题是,在类似rmap
:
rmap :: (forall x. f x -> g x) -> Rec f rs -> Rec g rs
的映射FN定义forall x
,但我tuplify
受到限制,而且我觉得物化应该移动的约束代入式(这是Dict
s为因为),但是,唉,至今没有运气。
你避免使用reifyNames'的'? (似乎已经为这种事情做好了准备......) – Alec