代码之家  ›  专栏  ›  技术社区  ›  mkUltra

haskell中的representable用于什么?

  •  5
  • mkUltra  · 技术社区  · 7 年前

    我想知道是什么 Representable 代表哈斯克尔。定义

    haskell类型类别上的可表示内函数与reader monad同构,因此可以免费继承大量属性。

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

    所以,我的问题是:

    • 可代表性用于什么?
    • 请澄清定义并举例说明。
    1 回复  |  直到 7 年前
        1
  •  9
  •   danidiaz    7 年前

    Representable s是类似于container的函数,它与另一个类型具有“特殊关系”,该类型用作 可表示的 . 在haskell定义中,此索引类型由关联的类型族给定 type Rep f :: *

    为了 每一个 索引和的值 每一个 价值观 可表示的 我们可以打电话给 index :: f a -> Rep f -> a 函数获取相应的元素。和 tabulate :: (Rep f -> a) -> f a 构造一个容器,其中每个元素都从其自己的索引派生。

    下面是一个不可表示的函数的例子:典型的haskell列表类型 [] . 有人可能天真地认为它可以被类似 Natural 但是问题是列表可以是空的,或者没有足够的元素来到达给定的索引。

    一个总是无限的类型 data Stream a = Stream a (Stream a) 可表示的 它的索引是 自然的 ,因为任何给定的 自然的 我们传递给 index .

    同理,齐次对 data Pair a = Pair a a 按类型索引 Bool :索引告诉我们要选择哪个组件。

    如果我们变得依赖性很强, fixed-size vectors 可表示的 并被索引为 finite naturals 以向量的大小为界。它们没有被无限的 自然的 因为这样我们就可以有一个越界的访问!


    读取为定义的各种实例 可表示的 这是有指导意义的,但似乎我们必须深入到源代码,因为相关的类型在Haddocks中不可见。一些有趣的消息:

    • 这个 Identity 按单位类型索引函数 () ,这是有意义的,因为 身份 可以说,只有一个“槽”,所以我们不需要提供任何信息。

    • “某种类型的功能”类型 ((->) e) 是由源类型本身索引的。和 指数 仅仅是 id . 这就是“同构于读者Monad”的意思,因为 Reader e Monad只是个新类型 ((-gt;)e) .

    • 这个 Composition 两个可表示的函子的(嵌套)是 可表示的 ,它由 一对 原始索引!这是有道理的:首先我们必须知道如何索引到外部函数,然后索引到内部函数。

    • 这个 Product (配对) 可表示的 函数是按和索引的( Either )原始索引的。的分支 要么 告诉我们要索引产品的哪个部分。

    • 一个显著的遗漏(因为一般来说这是不真实的):没有 (Representable f, Representable g) => Representable (Sum f g) 实例。