问题标签 [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 回答
367 浏览

haskell - 使用 Haskell 的大型结构上的多个拉链

可能重复:
具有多个光标的拉链式数据结构

让 T 一棵大树(或另一个大数据结构)。假设您在其中有一些兴趣点(P = {p1, p2, ...} 其中 pN in T)。您可以为每个 pN 使用拉链,但是,如果我必须在某些 pN 上更新 (CRUD) T 怎么办?

忽略共享内存问题(通过锁解决),使用命令式语言我可以使用指针。更新 pN 我真的在更新 T。

(“纯”)Haskell的正确方法是什么?

谢谢!

注意:P 是一个真实的列表,我们总是有兴趣点的 P,我们可以一次更新一个点,部分或全部。P的存在是为了避免每次搜索每个pN(T很大)。再次感谢!

更新:对不起,我找到了对我的问题的正确答复(像拉链一样具有多个游标的数​​据结构),我如何更新(或删除)我的问题?

0 投票
1 回答
718 浏览

haskell - 图形模型编辑器的 Zipper 数据结构

我正在为“模型”(即具有某种语义的框和线的集合,例如 UML,其细节在这里无关紧要)编写一个图形编辑器。所以我想要一个表示模型的数据结构和一个图表,其中对图表的编辑会导致模型发生相应的变化。因此,例如,如果模型元素的属性中有一些文本,并且我在图表中编辑文本,我希望更新模型元素。

该模型可能会表示为一棵树,但我希望图表编辑器尽可能少地了解模型表示。(我正在使用图表框架,因此将任意信息与图形元素关联起来很容易)。如果我能弄清楚应该是什么,可能会有一个“模型”类来对接口进行编码。

如果我用命令式语言来做这件事,那将很简单:我只需从图表中的图形元素到模型元素的引用。理论上,我仍然可以通过从大量 IORef 集合中构建模型来做到这一点,但这将是在 Haskell 中编写 Java 程序。

显然,每个图形元素都将有某种 cookie 与之相关联,这将使模型更新发生。一个简单的答案是给每个模型元素一个唯一的标识符并将模型存储在 Data.Map 查找表中。但这需要大量的簿记以确保没有两个模型元素获得相同的标识符。我也觉得它是一个“字符串类型”的解决方案;您必须处理一个对象被删除但在其他地方有一个悬空引用的情况,并且很难说您的类型中模型的内部结构。

另一方面,奥列格关于带有多个孔的拉链和具有清晰事务共享的光标的著作听起来像是一个更好的选择,如果我能理解的话。我了解了列表和树拉链的基本概念以及数据结构的差异化。图表中的每个元素都可以将光标放入模型的拉链中吗?因此,如果进行了更改,则可以将其提交给所有其他游标?包括树操作(例如将子树从一个地方移动到另一个地方)?

在这一点上,如果有某种关于定界延续的教程,以及它们如何使 Oleg 的多光标拉链工作的解释,这将特别有助于我,这比 Oleg 的帖子稍微不那么陡峭?

0 投票
1 回答
103 浏览

class - 用不同类型的当前元素和左/右列表泛化 Zipper 上的方法

我正在玩弄拉链,其中当前元素可以具有与左右列表不同的类型:

moveLeft可以使用和浏览拉链moveRight

在这里,listF将列表元素和当前元素转换为左侧或右侧的列表元素。currentF将当前元素和列表元素转换为当前元素。

如果当前类型和列表类型相等,则移动很简单:

一切都按预期工作,很好!

我现在想做的是概括上述想法,这样只需为给定的(比如, )实现listFandcurrentF函数,并自动做正确的事情。这样做的正确方法是什么?Z a ba :: Charb :: IntmoveLeftmoveRight

评论

我试图实现这样的类:

wheremoveLeft/Right是根据listFand实现的currentF,但这失败了

备注 2

我一般不喜欢上述想法的一点是允许任意函数listF并且currentF无法保证

(如果拉链在列表中,则在边框上无论如何都不存在)。执行此操作的任何提示?

0 投票
1 回答
1403 浏览

clojure - 异类树上的 Clojure 拉链

我在编写可以遍历异构节点树的拉链时遇到问题。我有 i) 地图列表。每个地图都有 ii) 一个 :inputs 键,其值是地图列表。

我想使用拉链来访问每一片叶子并添加一个计算值。代码块和输入树数据如下。我似乎无法获取访问叶节点的拉链代码,并添加 { :thing 123 }。我一定错过了一些简单的东西。有什么见解吗?

一种)

二)

谢谢

0 投票
1 回答
930 浏览

python - ord函数循环执行

我有两个文件夹,每个文件夹包含 196 个文件,它们都是 ( '\xae\xae\xb4\x9e\x8f\x9f\xba\xc1\xd5\xbd\xcd\xa1\xb7\') 格式。我正在尝试读取这些数据并将其转换为人类可读的形式。我想合并 2 文件夹的两个文件的数据。

我使用ord()函数尝试了这个,但是在尝试检索具有预期输出的单个文件时,我得到了错误的值。我尝试提取读取的第一个元素,但我得到的输出是所有文件的最前值。这是我的代码:

预期输出:

谢谢你的期待。

0 投票
1 回答
359 浏览

xml - Clojure:使用拉链从 xml 中提取值

我一直在努力解决这个问题,这可能是平庸的(或不是)。在这里 - 我想从 xml 中提取一些值。这是我的程序(应该重构,这是一个工作版本)

在 REPL (create-map-of-events) 中给了我一个 java.lang.RuntimeException: java.lang.NullPointerException

我对 xml1-> 做错了什么?

0 投票
2 回答
1831 浏览

clojure - 嵌套地图的 Clojure 拉链压制 TRIE

如何为 TRIE 创建一个 Clojure 拉链,由嵌套映射表示,键是字母。?

像这样的东西:

用 2 个单词 'banana' 和 'ana' 表示一个 trie。(如有必要,可以在地图中进行一些更改..)

我尝试将map? vals assoc3 个功能分别传递给拉链。但它似乎不起作用..

我应该使用哪三个功能?

以及基于 zipper 的 insert-into-trie 会是什么样子?

0 投票
1 回答
1586 浏览

jquery - 使用 php/jQuery 的拉链效果,如“zipper google doodle”

是否可以使用 jquery 而不是 flash 在页面上制作拉链效果?

例如以下但没有闪光灯(并且垂直坐着): http ://activeden.net/item/interactive-zipper/92456

我能做的最好的就是让我的拉链下降,然后两侧打开水平滑动哈哈,但我不太擅长 jQuery 业务哈哈

任何帮助或建议将不胜感激,

我的尝试,

CSS

0 投票
2 回答
1341 浏览

haskell - 在haskell中制作一个类似网格的数据类型

问题

一段时间以来,我一直想知道如何有效地完成这项工作,但由于某种原因,我一直无法做到。我需要建模一个矩形网格,其中每个字段都包含一些数据。

我需要通过拉链访问它,我的焦点是一个字段(可以说是值)。拉链应支持、和动作goDown,每个动作将焦点更改为指定方向上的字段,以及,这应返回当前处于焦点下的字段的值。goUpgoLeftgoRighthere

虽然这可以用 a 来完成,但从某种意义上说,它是低效的,因为 a 具有对数查找时间Map,因此改变焦点需要log n时间,因为 a具有对数查找时间。nMapMap

我需要指示的行动及时工作O(1)

例子

为便于说明,请查看下面的矩阵。括号内的数字是当前焦点。

如果我申请goRight,我应该得到:

如果我here现在申请,返回的值应该是3.

问题

上面解释的表单上的数据类型在 haskell 中的外观如何?它可以作为代数数据类型实现吗?

请记住,在所有四个方向上的焦点变化都应该及时可行O(1),以及读取当前焦点的值。

0 投票
1 回答
731 浏览

scala - Kiselyov 拉链的惯用 Scala 翻译?

Oleg Kiselyov展示了如何通过使用定界延续来从任何可遍历的对象中制作拉链。他的 Haskell 代码很短:

我在尝试在 Scala 中实现它时遇到了一些问题。我开始尝试使用 Scala 的 delimited continuations 包,但即使使用 Rompf 的richIterable思想推广到@cps[X] 而不是@suspendable,也不可能让提供的函数返回与提供的重置函数不同的类型。

我尝试按照 Kiselyov 的定义实现 continuation monad,但是 Scala 很难对类型参数进行柯里化,而且我无法弄清楚如何以 scalaz 的 traverse 方法满意的方式将 Cont[R] 转换为 monad。

我是 Haskell 和 Scala 的初学者,非常感谢您的帮助。