Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 可移动的拉链。必要性和充分性_Haskell_Zipper - Fatal编程技术网

Haskell 可移动的拉链。必要性和充分性

Haskell 可移动的拉链。必要性和充分性,haskell,zipper,Haskell,Zipper,每一个重载可遍历的类型T都会产生一个Zipper T,即实例可遍历T的存在是Zipper T的充分条件 是否有证据表明这也是一个必要条件?(我想这一定很简单,但到目前为止我还没有找到拉链的正式通用定义。)每个可遍历函子都是一个容器,元素的位置有限。为了在每个元素上组合计算效果,必须只有有限多个元素。因此,例如,无限的流函子是不可遍历的,因为没有办法提供可靠的函数来拉动可能。我们需要 sequence :: Stream (Maybe x) -> Maybe (Stream x) 但是,如

每一个重载可遍历的类型T都会产生一个Zipper T,即实例可遍历T的存在是Zipper T的充分条件


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

每个可遍历函子都是一个容器,元素的位置有限。为了在每个元素上组合计算效果,必须只有有限多个元素。因此,例如,无限的
函子是不可遍历的,因为没有办法提供可靠的函数来拉动
可能
。我们需要

sequence :: Stream (Maybe x) -> Maybe (Stream x)
但是,如果您想检查流中的所有内容是否都成功,则需要等待很长时间

拉链对应于识别特定元素位置的能力(这进一步导致了与衍生产品的联系,但这是另一回事)。为了能够将一个元素插回其孔中,您需要一种有效的方法来确定位置是否相等。如果您只有有限多个位置,那么这肯定是正确的(在没有信息隐藏的情况下)。因此,对于拉链来说,可以穿过就足够了

然而,这是没有必要的<代码>流有一个非常合理的拉链

type StreamContext x = ([x], Stream x)
type StreamZipper x = (StreamContext x, x)
它将上下文表示为所选元素前面的有限(ok,ok,添加一个或两个)列表和后面的无限流

无限
流中的位置是自然数。自然数有一个可判定的等式,但实际上有很多


tl;有限博士意味着可数,但反之亦然。

这听起来不太正确。例如,
sequence
一个无限的
IO
操作列表是完全可以的。(比如说,
sequence$map print$[1..]
)IO并不是一个非常有用的单子示例,因为它在现实世界中一直摇摆不定。因此,在流上排序是可以的。但IO的真实情况并不代表一般的单子。你无法计算一个无限的
序列,可能
都是
而已
。这与
IO
没有什么特别的关系。它适用于任何足够懒惰的
应用程序。另一个示例:
snd$runWriter$sequence\u$map(tell.return)$[1..]:[Int]
。你对
的看法是正确的,也许
,但在很多情况下,对一个无限容器进行排序还是有意义的。我没有生气。但我赞成准确。在列表的情况下,
sequence
在列表是有限的(我们经常假装它们一定是有限的)或者计算足够慢的情况下起作用。在显式无限流的情况下,无论是惰性的还是严格的,提供遍历效果似乎都是反常的。两者之间的差距很有趣:对于具有惰性效应的无限结构,我们只能得到“run”函数的近似值。我们不同意的地方是,我不认为偶然工作而不是打字检查会让事情变得完美。事实上,我对“但我们这里真正指的是有限列表”仍然是一个非正式的外部评论,而不是一个类型管理的属性感到不快,但那艘船很久以前就开航了。在Agda中,我很乐意区分列表和共线,并且只有前者是可遍历的。应用程序/可遍历的设置还很年轻,我们可能会费劲地想清楚这一点。特别是如果我们能整理出DefaultSuperclass实例。