3

假设我Distributive为某些复杂的自定义类型编写了一个实例,Foo. 是否可以仅使用其实例中可用的属性来编写Foo's实例?而且,如果不是,那么为什么是的超类?RepresentableDistributiveDistributiveRepresentable

4

1 回答 1

2

DistributiveRepresentable...之间的超类关系

class Distributive f => Representable f where

... 意味着如果f是 a Representable,那么它也必须是 a Distributive,而不是相反。当用于子类化时,=>应读作“是先决条件”,而不是“暗示”。(事实上​​,这与何时=>用于类型签名中的约束相反。出于这个原因, Purescript用于<=子类化。)

对于大多数其他成对的超类和子类,故事到此结束。DistributiveRepresentable,但是,有一个特殊的关系,因为Distributive函子实际上是可表示的,正如两者的文档所述Distributive......

绝对每个Distributive函子实际上是一个右伴随,因此它必须是内函子Representable并保留所有限制。这是一种奇特的说法,它与(->) x某些x.

...和Representable

AFunctor fRepresentableiftabulate并且index见证 的同构(->) x

每一个Distributive Functor其实都是Representable

Representable Functor从 Hask 到 Hask 的每一个都是正确的伴随。

层次结构按照它的方式设置,Distributive作为超类,因为Distributive它意味着有一个更简单的接口,可以在 Haskell 98 中表达,不像Representable(它使用类型族)和Adjunction(它是一个多参数类型类)。从更概念的角度来看,虽然分配律暗示每个Distributive人都是可表示的,但它们不足以弄清楚表示是什么。获得表示需要直接(如Representable)或间接(如Adjunction)指定它。

于 2018-03-26T17:59:00.333 回答