Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell gfoldl/Data.Data.Data实例,用于没有未安全强制的HLists_Haskell - Fatal编程技术网

Haskell gfoldl/Data.Data.Data实例,用于没有未安全强制的HLists

Haskell gfoldl/Data.Data.Data实例,用于没有未安全强制的HLists,haskell,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, 因此,一种解决方案是用具体的数据ca替换c instance (HBuild' '

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
, 因此,一种解决方案是用具体的
数据ca
替换
c

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
这似乎奏效了。但有解决办法吗 没有不安全因素?完整代码如下: