在Haskell中,Representable有什么用?

时间:2019-01-18 21:58:51

标签: haskell functor category-theory

我希望了解Representable在Haskell中的含义。定义

  

Haskell类型类别中可代表的endofunctors对读者monad是同构的,因此可以免费继承大量属性。

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

所以我的问题是:

  • 可代表对象的用途是什么?
  • 能否请您澄清一下定义并提供示例?

1 个答案:

答案 0 :(得分:9)

Representable是类似容器的函子,与另一个类型的“特殊关系”作为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进行索引,因为任何给定的{{1 }}传递给Natural

类似地,同质对index的索引类型为data Pair a = Pair a a:索引告诉我们选择哪个组件。

如果我们得到从属ish,则fixed-size vectorsBool,并以finite naturals为索引,并以向量的大小为界。它们不会被无界的Representable索引,因为那样我们就可以进行越界访问!


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

  • Representable函子由单元类型Identity进行索引,这很有意义,因为()仅具有一个“ slot”,因此我们不需要提供任何信息。

  • “某种类型的功能”类型Identity由源类型本身索引。 ((->) e)就是index。这就是“对阅读者monad同构”的含义,因为id monad只是Reader e之上的新类型。

  • 两个可表示函子的Composition(嵌套)再次为((->) e),并由原始索引的进行索引!这是有道理的:首先我们必须知道如何索引到外部函子,然后再索引到内部函子。

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

  • 一个明显的遗漏(因为它通常不是真的):没有Either实例。