如何仅使用分配属性编写可表示的实例?

时间:2018-03-26 17:27:42

标签: haskell typeclass representable distributive

假设我为一些复杂的自定义类型Distributive编写了Foo个实例。 是否可以仅使用Foo实例中提供的属性来编写Representable的{​​{1}}实例?如果没有,那么为什么DistributiveDistributive的超类?

1 个答案:

答案 0 :(得分:0)

引用Data.Distributive ...

的文档
  

分类上,每个Distributive仿函数实际上都是正确的伴随,因此它必须是Representable endofunctor并保留所有限制。对于某些(->) x来说这是x同形的一种奇特方式。

...和Data.Functor.Rep

  

如果Functorf见证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}}实例?如果没有,那么为什么DistributiveDistributive的超类?

请注意,我们从超类关系中得到的暗示是另一个方向 - 否则我们就会在每个Representable中有一个Monad的实例。 在此特定情况下,正如文档所指出的那样,“每Applicative Distributive实际上都是Functor”,尽管Rep type family的作用是如何制定Representable会妨碍实际实施RepresentabletabulateDist。无论如何,tabulateAdjunction and indexAdjunction显示了人们可能会如何做到这一点。 (右边邻接是分配的,另见this answer by Benjamin Hodgson。)