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 を記述できますが、制約に が含まれてしまうため、1 つの解決策は を具体的な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
これはうまくいくようです。しかし、unsafecoerces のない解決策はありますか? 完全なコードはこちら: http://lpaste.net/93565