假设我为一些复杂的自定义类型Distributive
编写了Foo
个实例。
是否可以仅使用Foo
实例中提供的属性来编写Representable
的{{1}}实例?如果没有,那么为什么Distributive
是Distributive
的超类?
答案 0 :(得分:0)
引用Data.Distributive
...
分类上,每个
Distributive
仿函数实际上都是正确的伴随,因此它必须是Representable
endofunctor并保留所有限制。对于某些(->) x
来说这是x
同形的一种奇特方式。
...和Data.Functor.Rep
:
如果
Functor
和f
见证Representable
的同构,则tabulate
index
为(->) x
。每个
Distributive
Functor
实际上都是Representable
。从Hask到Hask的每个
Representable
Functor
都是正确的伴随。
Data.Functor.Rep.distributeRep
见证我们可以从Distributable
中获取Representable
个实例:
distributeRep :: (Representable f, Functor w) => w (f a) -> f (w a)
distributeRep wf = tabulate (\k -> fmap (`index` k) wf)
是否可以仅使用
Foo
实例中提供的属性编写Representable
的{{1}}实例?如果没有,那么为什么Distributive
是Distributive
的超类?
请注意,我们从超类关系中得到的暗示是另一个方向 - 否则我们就会在每个Representable
中有一个Monad
的实例。 在此特定情况下,正如文档所指出的那样,“每Applicative
Distributive
实际上都是Functor
”,尽管Rep
type family的作用是如何制定Representable
会妨碍实际实施Representable
和tabulateDist
。无论如何,tabulateAdjunction
and indexAdjunction
显示了人们可能会如何做到这一点。 (右边邻接是分配的,另见this answer by Benjamin Hodgson。)