没有unsafeCoerce的HLists的gfoldl / Data.Data.Data实例

时间:2013-09-28 23:07:48

标签: haskell

Data类仅在方法中提到c类型变量,因此我似乎无法在实例的约束中提及它。

gfoldl :: Data a =>
  (forall d b. Data d => c (d -> b) -> d -> c b)
   -> (forall g. g -> c g)
   -> a
   -> c a

我可以为我的HList编写foldl,但约束最终包括c, 所以一个解决方案是用具体的c替换data C a

instance (HBuild' '[] g,
        Typeable (HList a),
        HFoldl (GfoldlK C) (C g) a (C (HList a)))
  => Data (HList a) where

    gfoldl k z xs = c3 $ hFoldl
                                (c1 (GfoldlK k))
                                (c2 (z hBuild))
                                xs
        where
              c1 :: forall c a. GfoldlK c -> GfoldlK C
              c1 = unsafeCoerce

              c2 :: forall c. c g -> C g
              c2 = unsafeCoerce

              c3 :: forall c. C (HList a) -> c (HList a)
              c3 = unsafeCoerce

这似乎有效。但是有解决方案吗? 没有不安全的制服?完整代码位于:http://lpaste.net/93565

0 个答案:

没有答案