mkU*_*tra 6 haskell functor category-theory
我想了解Representable在Haskell 中代表什么.定义
Haskell类型的可表示的endofunctors与读者monad同构,因此可以免费继承大量的属性.
对我来说不够清楚.我想看看一个真实的例子,了解我如何使用tabulate和index方法.
所以,我的问题是:
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)实例.