Haskell 中的 Representable 有什么用?

What is Representable used for in Haskell?

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

Representable endofunctors over the category of Haskell types are isomorphic to the reader monad and so inherit a very large number of properties for free.

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

所以,我的问题是:

Representable 是类似容器的函子,有一个 "special relationship" 和另一种类型,用作 Representable 的索引。在 Haskell 定义中,此索引类型由关联类型族 type Rep f :: *

给出

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

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

data Stream a = Stream a (Stream a) 这样的永远无限的类型是 Representable 并且它由 Natural 索引,因为总是有一个值我们传递给 index.

的任何给定 Natural

类似地,同构对 data Pair a = Pair a a 由类型 Bool 索引:索引告诉我们 select.

的哪个组件

如果我们得到依赖性,fixed-size vectors are Representable and are indexed by finite naturals 受向量大小的限制。它们没有被无限 Natural 索引,因为这样我们就可以进行越界访问!


阅读为 Representable 定义的各种实例很有启发性,但似乎我们必须深入了解源代码,因为相关类型在 Haddocks 中不可见。一些有趣的花絮:

  • Identity 函子由单位类型 () 索引,这是有道理的,因为 Identity 可以说只有一个 "slot",所以我们不需要提供任何信息。

  • "functions from some type" 类型 ((->) e) 由源类型本身索引。而 index 就是 id。这就是 "isomorphic to the reader monad" 的意思,因为 Reader e monad 只是 ((->) e).

  • 的新类型
  • 两个可表示函子的Composition(嵌套)又是Representable,它由索引原始索引!这是有道理的:首先我们必须知道如何索引到外部函子,然后再索引到内部函子。

  • 两个Representable函子的Product(配对)由原始索引的总和(Either)索引。 Either 的分支告诉我们索引产品的哪个部分。

  • 一个值得注意的遗漏(因为一般情况下不是这样):没有(Representable f, Representable g) => Representable (Sum f g)实例。