问题标签 [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.
function - Scheme zipper 谓词函数
我正在尝试编写一个谓词函数,该函数在将列表定义为拉链时返回 TRUE。拉链被定义为一个正确的列表,其中每个元素都是一个只有两个元素的列表,并且可以是任何表达式。
一个例子是
我尝试首先检查参数列表是否已满并返回 false,然后检查列表的 car 到其元素长度,并通过我的函数将列表的 cdr 传回,但我无法让它运行。
知道我做错了什么以及如何解决吗?我还在学习计划。
xml - 在 Clojure 中如何在集合上应用函数
我正在尝试在一组标签上应用从 xml 中提取一个标签内容的功能。基本上,我正在尝试制作一个从 xml 中提取内容的函数,就像这样
到目前为止,我的解决方案看起来像这样
在 REPL 中,当我尝试将 func 应用于这样的标签时
我得到一个空集合()。
haskell - 如何从 Haskell 中的语法规范构建抽象语法树?
我正在从事一个项目,该项目涉及在 Java 的一个非常小的子集中优化某些结构,并以 BNF 形式化。
如果我要在 Java 中执行此操作,我会使用 JTB 和 JavaCC 的组合来构建 AST。然后使用访问者来操纵树。但是,鉴于 Haskell 中有大量用于解析的库(parsec、happy、alex 等),我在选择合适的库时有点困惑。
所以,简单地说,当在 BNF 中指定一种语言时,哪个库提供了构建 AST 的最简单方法?在惯用的 Haskell 中修改这棵树的最佳方法是什么?
java - 文本编辑器的 Clojure 拉链结构(带有映射和数组)
我正在尝试在 clojure 中制作一个简单的文本编辑器,只是为了熟悉它。我正在考虑使用拉链来构建结构并导航和更新编辑器。
我正在考虑将编辑器的文本存储在文档中,例如:
所以我想制作一个能够轻松导航的拉链。也许拉链不是最好的?但我正在考虑从根开始。下去会带你到那个孩子的节点。所以文档的顶部是 id h1。
我有以下内容,但它不允许孩子成为一个数组:
它更期待类似的东西:
有什么想法吗?如果有人有任何建议,我愿意完全改变结构。
vb.net - Iconic.Zipper 文件
我正在使用 Ionic.Zip.ZipFile 读取文件检查是否存在,但返回编写的代码是 zip.Entries.Count,其中 zip 是 Ionic.Zip.ZipFile 的对象。
谁能建议 zip.Entries.Count 将返回什么?
谢谢
clojure - 以 Newick 格式懒惰地打印一棵树
我希望以Newick 格式打印一棵二叉树,显示每个节点到其父节点的距离。目前我没有遇到以下代码的问题,它使用常规递归,但是树太深可能会产生堆栈溢出。
我在当前实用程序(例如tree-seq
and clojure.walk
)中发现的问题是我必须多次访问内部节点,以插入逗号并关闭括号。我使用过clojure.zip
,但没有设法编写惰性/尾递归实现,因为我需要为每个内部节点存储它们已经被访问过的次数。
haskell - Traversable 和拉链。必要性和充分性
每个类型T重载Traversable都会产生一个Zipper T。即实例 Traversable T的存在是Zipper T的充分条件。
有证据证明这也是必要条件吗?(我想它一定很琐碎,但到目前为止我还没有找到拉链的正式通用定义。)
json - 有没有更简洁的方法来使用 Argonaut 删除顶级 JSON 属性?
假设我有这个小Argonaut Json
实例:
现在,我想删除键为viewed
. 我发现以下工作,但它有点过于冗长。有没有比这更短的:
另外,在我看来,“提交”更改(undo
)的方法的名称似乎有点误导?我应该如何解释这个名字?最初,我认为有一种方法可以撤消修改历史中的最后一次更改。
更新
我找到了一种解决方案。使用HCursor
:
但是,为什么undo
命名的问题undo
仍然悬而未决。
c++ - 在具有 O(1) 元素访问的 Haskell 中实现高效的拉链式数据结构
问题
我想创建一个数据类型,它允许快速访问和修改其元素。是否可以在 Haskell 中创建一个结构和函数,其执行速度与简单的 C++ 实现一样快?
问题详情
我正在用 Haskell 编写一个编译器。我已经用数据类型表示AST,让我们考虑以下一个:
每个 AST 节点都有一个唯一的标识符。我很想在 Haskell 中实现以下功能:
- 一个函数
getById
,它将返回一个O(1)
时间复杂度为选定 id 的 AST 节点。 - 能够在结构上创建“焦点”并相互独立地修改焦点元素。所以我希望能够记住一些子树的焦点,并能够在
O(1)
时间复杂度上修改每个这样的焦点。
我在考虑Zippers,但它们有 3 个问题:
- 它们(据我所知)与简单的数据类型一起使用,比如二叉树,我们可以说,我们选择“左”或“右”分支。是否有任何简单的方法可以在上述复杂数据类型上使用它们?
- 我认为他们不允许我实现
getById
具有O(1)
时间复杂度的功能,对吗? - 我认为使用 Zippers 创建一些独立的焦点是不可能的。我所说的独立焦点是指焦点,这将允许我们修改数据类型的不同部分,而无需重新计算其他焦点(在 中
O(1)
)。
C++ 的思维方式
在 C++ 中,我们将能够创建指向 AST 节点的指针数组nodePtrs
。该函数nodeById
将在 中执行O(1)
,只需访问*(nodePtrs[id])
. 因为 C++ 结构是可变的,所以我们可以在没有任何限制的情况下修改它的元素O(1)
。
xml - 用于创建 xml 请求的拉链?
如何创建一个XML
符合XSD
这样一个请求的请求是有效的?
一种方法是创建整个请求,然后在XSD
. 有没有办法在遍历架构时创建请求?
想到的第一个想法是 Zipper,但我真的不确定它们是否可以在这里使用。
也许我没有很好地理解它,但是如果已经定义了一些结构并且需要在该结构中进行更改,那么 Zipper 似乎很棒。拉链可以用于改变结构吗?(例如将序列附加到序列数组?)