什么是在Haskell中使用的Representable?

mkU*_*tra 6 haskell functor category-theory

我想了解Representable在Haskell 中代表什么.定义

Haskell类型的可表示的endofunctors与读者monad同构,因此可以免费继承大量的属性.

对我来说不够清楚.我想看看一个真实的例子,了解我如何使用tabulateindex方法.

所以,我的问题是:

  • 什么是Representable用于?
  • 你能澄清一下这个定义并提供一个例子吗?

dan*_*iaz 11

Representables是类似包含的仿函数,与另一种类型具有"特殊关系",作为索引Representable.在Haskell定义中,此索引类型由关联的类型族给出type Rep f :: *

对于每一个指标的值和每一个Representable,我们可以调用index :: f a -> Rep f -> a函数来获取相应的元素.并tabulate :: (Rep f -> a) -> f a构造一个容器,其中每个元素都是从它自己的索引派生的.

现在,这是一个不可表示的仿函数示例:典型的Haskell列表类型[].有人可能天真地认为它可以被类似a的东西索引Natural,但问题是列表可能是空的,或者没有足够的元素来达到给定的索引.

一个总是无限型状data Stream a = Stream a (Stream a) Representable,它的通过索引Natural,因为总是会有任何给定的值Natural,我们传递给index.

类似地,同类对data Pair a = Pair a a由类型索引Bool:索引告诉我们要选择哪个组件.

如果我们得到依赖性,那么固定大小的向量Representable有限自然的索引,并由向量的大小限定.它们没有被无界Naturals 索引,因为那时我们可以进行越界访问!


读取定义的各种实例Representable是有益的,但似乎我们必须深入到源代码,因为相关类型在Haddocks中不可见.一些有趣的花絮:

  • Identity函子是由单位类型索引(),这是有道理的,因为Identity只有一个"插槽"可以这么说,所以我们并不需要提供任何资料.

  • "某种类型的函数"类型((->) e)由源类型本身索引.而且index很简单id.这就是"与读者monad同构"的意思,因为Reader emonad只是一个新类型((->) e).

  • Composition两个可表示的仿函数的(嵌套)再次Representable,它由原始索引索引!这是有道理的:首先我们必须知道如何索引外部仿函数,然后进入内部仿函数.

  • Product两个Representable仿函数的(配对)由Either原始索引的sum()索引.分支Either告诉我们要在哪个产品部分进行索引.

  • 一个值得注意的遗漏(因为它一般不是真的):没有(Representable f, Representable g) => Representable (Sum f g)实例.

  • 我要补充一点,总的来说,产品类型是可表示的,而总和类型则不是。直觉是表示形式就像数据结构的对数(这是因为函数类型是指数形式)。产品的对数是对数之和。但是,总的来说,对数的对数没有简单的公式。该列表无法表示,因为它是Nil和Cons的总和。流是可表示的,因为它没有Nil,而Cons是产品。 (3认同)
  • 提供其核心数据类型可表示实例的软件包的示例:http://hackage.haskell.org/package/grids以及https://twitter.com/phadej/status/1037667021968822272 (2认同)