使用 Barbies 或 Higgledy 将应用效果推入 HKD 领域
Pushing applicative effects into HKD fields with Barbies or Higgledy
我正在使用 barbies-th
将记录类型转换为更高级的数据类型:
declareBareB [d|
data Foo = MkFoo
{ field1 :: Int
, field2 :: Bool
} |]
然后我可以编写一个函数将任何应用效果推送到各个字段中:
bdistribute :: (Applicative f) => f (Foo Bare Identity) -> Foo Covered f
bdistribute foo = MkFoo
{ field1 = field1 <$> foo
, field2 = field2 <$> foo
}
不过感觉我应该可以写bdistribute
一劳永逸的给所有的芭比风格的HKD。换句话说,我正在寻找 Higgledy 的 construct
的对偶。 Higgledy 在 Construct
类型类中有这两个方法:
construct :: HKD structure f -> f structure
deconstruct :: structure -> HKD structure f
但我想要
nstruct :: (Applicative f) => f structure -> HKD structure f
下面的头脑风暴:我刚才的一个想法是,这个问题可以简化为编写以下通用函数:
shape :: Foo Covered ((->) (Foo Bare Identity))
shape = MkFoo
{ field1 = field1
, field2 = field2
}
从那以后我们有
bdistribute :: (Applicative f) => f (Foo Bare Identity) -> Foo Covered f
bdistribute = bmap (<$> x) shape
更一般地,从shape
我们也可以写成
bdistribute :: (Functor f, Applicative g, ApplicativeB b, TraversableB b) => f (b g) -> b (Compose f g)
bdistribute x = bmap (\f -> Compose $ fmap f . bsequence' <$> x) shape
我最后添加了一个 DistributiveB
typeclass
到 Barbies 包,从 2.0.1.0 开始可用:
class FunctorB b => DistributiveB (b :: (k -> Type) -> Type) where
bdistribute :: Functor f => f (b g) -> b (Compose f g)
要从我原来的问题中恢复 shape
功能,我们可以使用 bdistribute
的以下专用版本:
bdecompose :: DistributiveB b => (a -> b Identity) -> b ((->) a)
这给了我们 shape = bdecompose id
我正在使用 barbies-th
将记录类型转换为更高级的数据类型:
declareBareB [d|
data Foo = MkFoo
{ field1 :: Int
, field2 :: Bool
} |]
然后我可以编写一个函数将任何应用效果推送到各个字段中:
bdistribute :: (Applicative f) => f (Foo Bare Identity) -> Foo Covered f
bdistribute foo = MkFoo
{ field1 = field1 <$> foo
, field2 = field2 <$> foo
}
不过感觉我应该可以写bdistribute
一劳永逸的给所有的芭比风格的HKD。换句话说,我正在寻找 Higgledy 的 construct
的对偶。 Higgledy 在 Construct
类型类中有这两个方法:
construct :: HKD structure f -> f structure
deconstruct :: structure -> HKD structure f
但我想要
nstruct :: (Applicative f) => f structure -> HKD structure f
下面的头脑风暴:我刚才的一个想法是,这个问题可以简化为编写以下通用函数:
shape :: Foo Covered ((->) (Foo Bare Identity))
shape = MkFoo
{ field1 = field1
, field2 = field2
}
从那以后我们有
bdistribute :: (Applicative f) => f (Foo Bare Identity) -> Foo Covered f
bdistribute = bmap (<$> x) shape
更一般地,从shape
我们也可以写成
bdistribute :: (Functor f, Applicative g, ApplicativeB b, TraversableB b) => f (b g) -> b (Compose f g)
bdistribute x = bmap (\f -> Compose $ fmap f . bsequence' <$> x) shape
我最后添加了一个 DistributiveB
typeclass
到 Barbies 包,从 2.0.1.0 开始可用:
class FunctorB b => DistributiveB (b :: (k -> Type) -> Type) where
bdistribute :: Functor f => f (b g) -> b (Compose f g)
要从我原来的问题中恢复 shape
功能,我们可以使用 bdistribute
的以下专用版本:
bdecompose :: DistributiveB b => (a -> b Identity) -> b ((->) a)
这给了我们 shape = bdecompose id