Haskell 中的 Representable 有什么用?
What is Representable used for in Haskell?
我想了解 Representable 在 Haskell 中代表什么。定义
Representable endofunctors over the category of Haskell types are isomorphic to the reader monad and so inherit a very large number of properties for free.
我还不够清楚。我想看一个真实的例子,了解如何使用 tabulate
和 index
方法。
所以,我的问题是:
- Representable 有什么用?
- 能否解释一下定义并提供示例?
Representable
是类似容器的函子,有一个 "special relationship" 和另一种类型,用作 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
索引,因为总是有一个值我们传递给 index
.
的任何给定 Natural
类似地,同构对 data Pair a = Pair a a
由类型 Bool
索引:索引告诉我们 select.
的哪个组件
如果我们得到依赖性,fixed-size vectors are Representable
and are indexed by finite naturals 受向量大小的限制。它们没有被无限 Natural
索引,因为这样我们就可以进行越界访问!
阅读为 Representable
定义的各种实例很有启发性,但似乎我们必须深入了解源代码,因为相关类型在 Haddocks 中不可见。一些有趣的花絮:
Identity
函子由单位类型 ()
索引,这是有道理的,因为 Identity
可以说只有一个 "slot",所以我们不需要提供任何信息。
"functions from some type" 类型 ((->) e)
由源类型本身索引。而 index
就是 id
。这就是 "isomorphic to the reader monad" 的意思,因为 Reader e
monad 只是 ((->) e)
.
的新类型
两个可表示函子的Composition
(嵌套)又是Representable
,它由对索引原始索引!这是有道理的:首先我们必须知道如何索引到外部函子,然后再索引到内部函子。
两个Representable
函子的Product
(配对)由原始索引的总和(Either
)索引。 Either
的分支告诉我们索引产品的哪个部分。
一个值得注意的遗漏(因为一般情况下不是这样):没有(Representable f, Representable g) => Representable (Sum f g)
实例。
我想了解 Representable 在 Haskell 中代表什么。定义
Representable endofunctors over the category of Haskell types are isomorphic to the reader monad and so inherit a very large number of properties for free.
我还不够清楚。我想看一个真实的例子,了解如何使用 tabulate
和 index
方法。
所以,我的问题是:
- Representable 有什么用?
- 能否解释一下定义并提供示例?
Representable
是类似容器的函子,有一个 "special relationship" 和另一种类型,用作 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
索引,因为总是有一个值我们传递给 index
.
Natural
类似地,同构对 data Pair a = Pair a a
由类型 Bool
索引:索引告诉我们 select.
如果我们得到依赖性,fixed-size vectors are Representable
and are indexed by finite naturals 受向量大小的限制。它们没有被无限 Natural
索引,因为这样我们就可以进行越界访问!
阅读为 Representable
定义的各种实例很有启发性,但似乎我们必须深入了解源代码,因为相关类型在 Haddocks 中不可见。一些有趣的花絮:
Identity
函子由单位类型()
索引,这是有道理的,因为Identity
可以说只有一个 "slot",所以我们不需要提供任何信息。"functions from some type" 类型
((->) e)
由源类型本身索引。而index
就是id
。这就是 "isomorphic to the reader monad" 的意思,因为Reader e
monad 只是((->) e)
. 的新类型
两个可表示函子的
Composition
(嵌套)又是Representable
,它由对索引原始索引!这是有道理的:首先我们必须知道如何索引到外部函子,然后再索引到内部函子。两个
Representable
函子的Product
(配对)由原始索引的总和(Either
)索引。Either
的分支告诉我们索引产品的哪个部分。一个值得注意的遗漏(因为一般情况下不是这样):没有
(Representable f, Representable g) => Representable (Sum f g)
实例。