我希望了解Representable在Haskell中的含义。定义
Haskell类型类别中可代表的endofunctors对读者monad是同构的,因此可以免费继承大量属性。
对我来说还不够清楚。我想看一个真实的例子,以了解如何使用tabulate
和index
方法。
所以我的问题是:
答案 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 vectors为Bool
,并以finite naturals为索引,并以向量的大小为界。它们不会被无界的Representable
索引,因为那样我们就可以进行越界访问!
读取为Natural
定义的各种实例是有启发性的,但是似乎我们必须深入到源代码,因为相关的类型在Haddock中不可见。一些有趣的花絮:
Representable
函子由单元类型Identity
进行索引,这很有意义,因为()
仅具有一个“ slot”,因此我们不需要提供任何信息。
“某种类型的功能”类型Identity
由源类型本身索引。 ((->) e)
就是index
。这就是“对阅读者monad同构”的含义,因为id
monad只是Reader e
之上的新类型。
两个可表示函子的Composition
(嵌套)再次为((->) e)
,并由原始索引的对进行索引!这是有道理的:首先我们必须知道如何索引到外部函子,然后再索引到内部函子。
两个Representable
仿函数的Product
(对)由原始索引的总和(Representable
索引。 Either
的分支告诉我们要在产品的哪个部分进行索引。
一个明显的遗漏(因为它通常不是真的):没有Either
实例。