7

AFunList是 Twan van Laarhoven 在这篇博文中发明的一种数据类型。Bartosz Milewski 给出的一个小变化如下所示:

data FunList a b t = Done t 
                   | More a (FunList a b (b -> t))

关于这个数据类型的一个有趣的事实是,如果我们稍微调整一下类型参数,我们有一个Profunctor

data FunList t b a
  = Done t 
  | More a (FunList (b -> t) b a)

mapResult :: (a -> b) -> FunList a x y -> FunList b x y
mapResult f (Done x)   = Done $ f x
mapResult f (More a r) = More a $ mapResult (f .) r

instance Profunctor (FunList t)
  where
  dimap _ _ (Done t) = Done t
  dimap f g (More a r) = More (g a) $ dimap f g $ mapResult (. f) r

服从dimap id id = iddimap (f . g) (h . i) = dimap g h . dimap f i

该类Profunctor有几个有用的子类,它们代表带有附加设备的 profunctor 家族(在范畴理论意义上)。具体来说,我们可以谈论具有“强度”的profunctors:

class Profunctor p => Strong t1 t2 p
  where
  pstrength :: p a b -> p (t1 a x) (t2 b x)

法律由“双范畴中的强单子”的分类概念决定(这在Kazuyuki Asada的“箭头是强单子”中有详细解释)。

类似地,由于 profunctor 是“just” functor,我们可以查看 profunctor 是否是幺半群的:

class Profunctor p => SemigroupalProfunctor t1 t2 t3 p
  where
  combine :: t3 (p a b) (p c d) -> p (t1 a c) (t2 b d)

class SemigroupalProfunctor t1 t2 t3 p => MonoidalProfunctor t1 i1 t2 i2 t3 i3 p
  where
  unit :: i3 -> p i1 i2

具有由单曲面函子的定义给出的定律。

t1, t2,t3i1,的一些有趣的选择分别是, i2,和。i3(,)EitherThese()Void

FunList问题是重组后的实例化了哪些此类?带有一些关于为什么它遵循法律的论据的实现会非常好,正确性的证明会非常好。

TODO:在此处专门列出每个类别的法律列表

4

0 回答 0