可穿越和拉链。必要性和充足性

时间:2013-11-12 19:42:42

标签: haskell zipper

每个 T 重载 Traversable 的类型都会带来 Zipper T 。即存在实例Traversable T Zipper T 的充分条件。

是否有证据证明这也是必要条件? (我想它一定是非常简单的,但到目前为止我还没有找到拉链的正式通用定义。)

1 个答案:

答案 0 :(得分:11)

每个Traversable仿函数都是一个容器,其元素位置有限。为了在每个元素上组合计算效果,必须只有有限的许多。因此,例如,无限Stream仿函数不是可遍历的,因为无法提供可靠的函数来提取Maybe。我们需要

sequence :: Stream (Maybe x) -> Maybe (Stream x)

但如果您想检查流中的所有内容是否成功,那么您将等待很长时间。

拉链对应于识别特定元素位置的能力(这进一步导致与衍生物的联系,但这是另一个故事)。为了能够将元素插回其孔中,您需要一种有效的方法来确定位置上的相等性。如果你只有有限的多个位置,那就必然是真的(在没有信息隐藏的情况下)。因此,Traversable当然足以拥有一个Zipper。

但是,没有必要这样做。 Stream有一个非常明智的拉链

type StreamContext x = ([x], Stream x)
type StreamZipper x = (StreamContext x, x)

将上下文表示为所选元素之前的有限(ok,ok,add a bang或two)列表以及之后的无限流。

无限Stream中的位置是自然数。自然数字具有可判定的平等性,但其中有很多都是平等的。

tl; dr limited意味着可数,但反之亦然。