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 = id
和dimap (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
,t3
和i1
,的一些有趣的选择分别是, i2
,和。i3
(,)
Either
These
()
Void
FunList
问题是重组后的实例化了哪些此类?带有一些关于为什么它遵循法律的论据的实现会非常好,正确性的证明会非常好。
TODO:在此处专门列出每个类别的法律列表