在Haskell中,什么是可表示的?
我想了解哈斯克尔代表什么。定义 Haskell类型范畴上的可表示内函子同构于reader monad,因此可以免费继承大量属性 对我来说还不够清楚。我想看一个真实的例子,了解如何使用在Haskell中,什么是可表示的?,haskell,functor,category-theory,Haskell,Functor,Category Theory,我想了解哈斯克尔代表什么。定义 Haskell类型范畴上的可表示内函子同构于reader monad,因此可以免费继承大量属性 对我来说还不够清楚。我想看一个真实的例子,了解如何使用制表和索引方法 所以,我的问题是: “可代表性”用于什么 请你澄清一下定义并举个例子好吗 可表示的是类似于容器的函子,它与另一种类型有“特殊关系”,作为可表示的的索引。在Haskell定义中,此索引类型由关联的类型族type Rep f::* 对于索引的每个值和可表示的的每个值,我们可以调用索引::f a->Rep
制表
和索引
方法
所以,我的问题是:
- “可代表性”用于什么
- 请你澄清一下定义并举个例子好吗
可表示的
是类似于容器的函子,它与另一种类型有“特殊关系”,作为可表示的
的索引。在Haskell定义中,此索引类型由关联的类型族type Rep f::*
对于索引的每个值和可表示的的每个值,我们可以调用索引::f a->Rep f->a
函数来获取相应的元素。和制表::(Rep f->a)->fa
构造一个容器,其中每个元素都是从自己的索引派生的
现在,这里有一个不可表示的函子示例:典型的Haskell列表类型[]
。有人可能会天真地认为它可以通过类似于的索引进行索引,但问题是列表可能是空的,或者没有足够的元素来访问给定的索引
像数据流a=流a(流a)
这样的总是无限的类型是可表示的
,它由自然
索引,因为对于任何给定的自然
,我们传递给索引
,总会有一个值
类似地,同质对数据对a=对a
由类型Bool
索引:索引告诉我们要选择哪些组件
如果我们得到相依ish,则它们是可表示的
,并且通过向量的大小进行索引。它们不会被无界的Natural
s索引,因为这样我们就可以进行越界访问了
阅读为Representable
定义的各种实例很有启发性,但我们似乎必须深入到源代码,因为相关类型在haddock中不可见。一些有趣的花絮:
Identity
函子由单位类型()
索引,这是有意义的,因为Identity
可以说只有一个“槽”,所以我们不需要提供任何信息
- “某些类型的函数”类型
((->)e)
由源类型本身编制索引。而索引
只是id
。这就是所谓“同构于读卡器monad”的意思,因为读卡器e
monad只是(->)e
上的一个新类型
- 两个可表示函子的(嵌套)也是可表示的,它由一对原始索引索引!这很有意义:首先我们必须知道如何索引到外部函子,然后索引到内部函子
- 两个
可表示的
函子的(配对)由原始索引的和(或
)索引。的分支告诉我们要索引产品的哪个部分
- 一个值得注意的遗漏(因为它通常不正确):没有
(可表示f,可表示g)=>可表示(和fg)
实例
这可能需要更多关于你所做和不理解的细节。例如,您是否熟悉类型族?一般来说是类型类吗?@jberryman是的,我非常熟悉类型类。老实说,我不清楚什么是单子,但functor对我来说很清楚。一个为其核心数据类型提供可表示实例的包的示例:我还要补充一点,一般来说,乘积类型是可表示的,而和类型不是。直观地说,表示形式类似于数据结构的对数(这是因为函数类型是指数型的)。乘积的对数是对数之和。但是,总的来说,没有简单的求和对数的公式。这个列表是不可表示的,因为它是零和反的总和。流是可表示的,因为它没有Nil,Cons是一个乘积。在Idris中,作为Fin表示的函子的向量: