在Haskell中,什么是可表示的?

在Haskell中,什么是可表示的?,haskell,functor,category-theory,Haskell,Functor,Category Theory,我想了解哈斯克尔代表什么。定义 Haskell类型范畴上的可表示内函子同构于reader monad,因此可以免费继承大量属性 对我来说还不够清楚。我想看一个真实的例子,了解如何使用制表和索引方法 所以,我的问题是: “可代表性”用于什么 请你澄清一下定义并举个例子好吗 可表示的是类似于容器的函子,它与另一种类型有“特殊关系”,作为可表示的的索引。在Haskell定义中,此索引类型由关联的类型族type Rep f::* 对于索引的每个值和可表示的的每个值,我们可以调用索引::f a->Rep

我想了解哈斯克尔代表什么。定义

Haskell类型范畴上的可表示内函子同构于reader monad,因此可以免费继承大量属性

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

所以,我的问题是:

  • “可代表性”用于什么
  • 请你澄清一下定义并举个例子好吗

可表示的
是类似于容器的函子,它与另一种类型有“特殊关系”,作为
可表示的
的索引。在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表示的函子的向量: