我有一個可擴展的乙烯基/複合記錄(類似於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