问题标签 [zipper]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
312 浏览

haskell - Haskell 中存在类型的类型错误

我在我的程序中与存在类型作斗争。我想我正在尝试做一些非常合理的事情但是我无法通过类型检查器:(

我有一种模仿 Monad 的数据类型

现在我为它创建一个上下文,类似于Haskell Wiki 文章中描述的 Zipper,但是为了简单起见,我使用函数而不是数据结构 -

现在,当我尝试编写一个将数据值拆分为其上下文和子值的函数时,类型检查器会抱怨-

错误是 -

但是,我可以像这样解决它 -

为什么第二个定义类型检查而不是第一个?

此外,如果我尝试ctx通过检查 R 来转换为完整的函数,我会再次收到类型检查错误 -

错误 -

我该如何解决这个错误?

任何帮助表示赞赏!

0 投票
1 回答
834 浏览

data-structures - 简单的树遍历和快速的随机节点访问

在亚历克斯·塔格特下面的评论之后编辑。

我正在使用拉链轻松遍历和编辑可以增长到数千个节点的树。每个节点在第一次创建时都是不完整的。数据将一直在随机位置添加/删除,叶节点将被分支替换,等等。

树可能非常不平衡。对节点的快速随机访问也很重要。

一种实现是使用 zipper 遍历树并创建由键索引的节点的哈希表。不用说上面的效率很低,因为:

  • 每个节点需要创建2个副本
  • 任何更改都需要在 2 个数据结构(树和哈希图)之间一致地镜像。

简而言之,是否有一种时间/空间有效的方法来结合使用拉链的轻松遍历/更新和 clojure 中哈希表的快速访问?

0 投票
3 回答
2159 浏览

haskell - 二维拉链

受最近关于 Haskell 中二维网格的问题的启发,我想知道是否可以创建一个二维拉链来跟踪列表列表中的位置。列表上的一维拉链使我们能够真正有效地在大列表中本地移动(常见的例子是文本编辑器)。但是假设我们有这样的第二个维度:

我们可以创建某种拉链数据结构来有效地在网格中左右移动而且上下移动吗?如果是这样,如果我们用无限列表的无限列表替换列表列表,我们还能获得有效的移动吗?

0 投票
1 回答
223 浏览

tree - 本地编辑纯功能树

让我们定义一棵树 T:

假设一个新节点被添加到 E,产生 T':

在可变语言中,这是一项简单的任务——只需更新 E 的孩子,我们就完成了。然而,在一个不可变的世界中,首先必须知道通往 E 的路径,然后从 E + new child 导出 E',然后导出 B',最后导出 A'(= T')。

这很麻烦;理想情况下,将有一些函数会采用 E 和 G(可能还有 T)的值并产生 T',而不提供 E 的路径。

我看到了两种可能的方法来解决这个问题:

  • 父引用 - 这样,每个节点都能够派生到根的路径。两个问题:创建两个相互引用的节点(即父 <-> 子)在纯函数式语言中是一个问题(任何简单的解决方案?);并且每当 E ​​-> E' 被派生时, E' 的所有孩子也需要新派生,因为它们现在存储 E 的旧值而不是 E'。
  • 拉链 - 每个节点在创建时存储一个拉链,从其父拉链派生。相互引用的问题消失了,但是当 E -> E' 被派生时,所有 E' 的孩子的拉链也需要被派生,因为它们现在指向旧树 E。

考虑到合理的表现,我的愿望是否可能实现?非常感谢您的任何意见!

0 投票
2 回答
226 浏览

serialization - 序列化拉链?

当我打印出 repl 上的拉链时,我看到了这些数据。我在想这可能是我序列化拉链所需的所有数据?是否可以从提供的数据中反序列化拉链?

我正在寻找类似下面想象的 zip/serialize 和 zip/deserialize 函数。

有谁知道如何做到这一点?

0 投票
2 回答
321 浏览

xml - Clojure 中对 XML 文档的多次更改

我正在为一个简单的项目尝试clojure(第一次)。我需要更新一个给定 csv 文件的 xml 树。我正在逐行读取 csv 文件,提取一些值,循环给定一些值的节点并插入具有另一个值的子节点。

这在我第一次插入项目时工作正常。我第二次得到 NullPointerException (没有痕迹)。我从从 insert-child 获得的返回值中查找根,并将该根节点传递给下一个循环。不知何故,第二次插入在该根元素上失败了。有人知道这里出了什么问题吗?或对此代码的一般反馈,因为这是我第一次尝试编写一些 Clojure。

0 投票
1 回答
102 浏览

haskell - 密集的信号树

我收集实时信号,计算派生信号并将原始数据和派生数据存储在循环缓冲区中,因此我只保存最后一百万个样本。

有时我需要序列化所有信号的当前值。所以我需要类似的东西:

SignalBuffer是一个序列SignalValue。它可以是一个未装箱的浮点数组。Haskell 可以Functor为我派生实例,因此我可以使用从每个fmap中获取最后一个并将结构传递给以进行序列化。SignalValueSignalBufferAeson

如何实现循环缓冲区 API,SignalBuffer以便在新滴答到达时将新值推送到所有缓冲区?我想节省内存,所以我想我必须使用未装箱的数组。使用可变的未装箱数组(STUArray?)是否有利,因此数组更新不会堆积在内存中?是否可以在此设置中使用可变数组?我已经准备好改变MyDataCurrentSignals无论做什么工作。

我知道如何实现循环缓冲区,问题是如何优雅地将更新应用于MyData.

我在想类似的东西

一些信号是其他信号的“卷积”(不是真正的卷积,而是一种类似的处理)。要更新信号的缓冲区,我需要访问其他信号的缓冲区——这就是 UpdateFunc 接受MyDataSignalValue返回缓冲区修改函数的原因。

updateAllBuffers然后“拉链”D0 UpdateFuncMyData获得新的MyData.

当然,我已经准备好使用Modifier适合我任务的任何东西——它可以是一个函数、一个单子值等。

0 投票
1 回答
464 浏览

xml - Anti-XML 中的拉链

这个问题中,提问者想要像这样转换文档:

进入这个:

正如我在那里的回答中指出的那样,Anti-XML拉链为这个问题提供了一个干净的解决方案。例如,以下内容可用于重命名空白元素:

不幸的是,以下方法不起作用:

因为当然,一旦我们zipWithIndex-ed zipper,我们就不再有 zipper,只是IndexedSeq- 我们不能有 a Zipper[(Node, Int)],因为定义是trait Zipper[+A <: Node] ....

是否有一种干净的方式来使用zipzipWithIndex在 Anti-XML 拉链上,使用 等进行一些其他操作map,最终得到仍然是拉链的东西?

0 投票
2 回答
776 浏览

haskell - 具有许多构造函数的 ADT 的 Haskell Zipper

我有一些 ADT 代表 Haskell 中的简单几何树。将我的操作类型与树形结构分开的事情让我很困扰。我正在考虑让 Tree 类型包含运算符的构造函数,看起来它会更干净。我看到的一个问题是我的 Zipper 实现必须改变以反映所有这些新的可能的构造函数。有没有办法解决?还是我错过了一些重要的概念?总的来说,我觉得我很难掌握如何在 Haskell 中构建我的程序。我了解大多数概念、ADT、类型类、单子,但我还不了解大局。谢谢。

0 投票
2 回答
402 浏览

scala - 如何在 HUET 拉链内向上导航

我正在阅读Huet Zipper,我无法理解 go_up 方法:

其他类型定义的完整来源可以在链接的论文中找到,如果您了解 Zipper,我认为回答我的问题并不重要。

根据我对 Zipper 的了解,aLocation包含当前节点及其Path或所谓的 Context. 拥有除了当前节点及其子节点之外的Path所有内容,或者有些人称之为a one-hole-context

好吧,将焦点上移,意味着当前节点的父节点将成为新的当前节点。但在这里,作者连接了当前节点及其兄弟节点。但这不是父节点,只是父节点的子节点。在 Scala 中实现我自己的 moveUp 方法时,我被困在这里,并且无法正确表示当前节点的父节点。