每个 T 重载 Traversable 的类型都会带来 Zipper T 。即存在实例Traversable T 是 Zipper T 的充分条件。
是否有证据证明这也是必要条件? (我想它一定是非常简单的,但到目前为止我还没有找到拉链的正式通用定义。)
答案 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意味着可数,但反之亦然。