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

scala - Zipper 迭代 Scala 中的列表

这是我之前的问题的后续。我可以使用迭代器、、、foldzip其他迭代器foreach来迭代 Scala 中的列表。现在我想知道是否有Zipper最合适的用例。假设我需要没有并发的只读访问。

你能举一个这样的例子并解释为什么Zipper是最好的选择吗?

0 投票
1 回答
2876 浏览

scala - 了解为什么 Zipper 是 Comonad

这是我上一个问题的答案的后续。

假设我需要将每个项目映射到a:A函数并生成。List[A]b:Bdef f(a:A, leftNeighbors:List[A]): BList[B]

显然我不能只调用map列表,但我可以使用列表拉链。拉链是在列表中移动的光标。它提供对当前元素 ( focus) 及其邻居的访问。

现在我可以替换 myf并将 def f'(z:Zipper[A]):B = f(z.focus, z.left)这个新函数传递f'cobind.Zipper[A]

像这样的cobind工作:它f'用拉链调用它,然后移动拉链,f'的“移动”拉链调用,再次移动拉链,依此类推......直到拉链到达列表的末尾。

最后,cobind返回一个新的 zipper 类型Zipper[B],可以转换为列表,这样问题就解决了。

现在注意和之间的对称性cobind[A](f:Zipper[A] => B):Zipper[B]bind[A](f:A => List[B]):List[B]这就是为什么List是 aMonadZipper是 a Comonad

是否有意义 ?

0 投票
1 回答
78 浏览

scala - 用 Zipper 解决 Twitter 水坑

这是我之前的问题的后续。考虑以下谜题

我想生成一个waterLevel数组,让第 i 项是第 i 点的水位,然后将它们相加以解决难题。

我可能会尝试用Zipper

是否有意义 ?

0 投票
1 回答
392 浏览

xml - Scala 中的 XML 转换

我现在正在处理 XML 转换。例如,

  • 将所有节点替换<a><b>
  • <c x = "xxx"><d y="xxx">等替换所有节点。

我正在使用标准的scala.xml RewriteRuleRuleTransformer. 我将其扩展RewriteRule并传递给一个RuleTransformer实例,该实例将规则应用于 XML。

我知道还有其他工具可以完成这项工作:lenses、、zippers等等。它们可以根据需要转换 XML 吗?与我目前的方法相比,它们有什么优势?

0 投票
1 回答
202 浏览

haskell - 有什么证据表明 Clojure 拉链会从以共单胞形式表达中受益?

本演示文稿[2005] 中,我们在幻灯片 32 处阅读:

zipper 数据类型隐藏了一个comonad。这正是构建属性评估所需要的共同点。

因此,您似乎可以用 Comonads 来表达 Zippers这在 Scala 中似乎是可能的。

查看zipper 源代码,我们看到 zippers 表示为 Clojure 元数据。

我的问题是,有什么证据表明 Clojure 拉链会从以共单胞形式表达中受益?

Eric 建议这样做的好处是

所以我们需要在原始组上获得所有可能的拉链!

0 投票
1 回答
2178 浏览

haskell - 如何使二叉树拉链成为 Comonad 的实例?

我想让二叉树拉链成为comonad的实例,但我不知道如何duplicate正确实现。

这是我的尝试:

一些解释:

  • BinTree a是二叉树数据类型,每个树节点都包含一个标签。
  • Partial a是具有左子树或右子树的二叉树。我的代码中的一堆Partial a 扮演着数据上下文的角色。
  • BTZ代表BinTree拉链,我想创建一个实例Comonad,它由数据上下文和聚焦子树组成。

为了使其成为 的实例Comonad,我的计划是实现extractand duplicate,并通过采用一些随机二叉树来验证共单属性是否成立。

extract很简单,只需取出聚焦子树。

函数dup用作辅助函数,用专注于该节点的树拉链替换每个节点标签。

对于duplicate z,节点标签必须是z它自己才能extract . duplicate == id成立。对于非叶节点,我dup习惯于处理它们的子树,就好像它们没有父节点一样,然后将当前焦点z和数据上下文的其余部分附加到这些拉链上。

到目前为止,前两个comonad 属性已满足(extract . duplicate = idfmap extract . duplicate),但我不知道如何处理数据上下文。我目前所做的就是拉上拉链z并继续往上走。在此过程中,我们采用每个数据上下文堆栈的顶部来构建新的数据上下文堆栈,这听起来是正确的,而且是正确的类型 ( [Partial (BTZ a)]。但是我的方法不能满足第三定律。

给定上面二叉树拉链的数据类型定义,是否可以使其成为 Comonad 的实例?如果答案是肯定的,那么我的方法有问题吗?

0 投票
3 回答
6801 浏览

haskell - 拉链共胞,一般

给定任何容器类型,我们可以形成(以元素为中心的)拉链,并且知道这个结构是一个 Comonad。最近在另一个 Stack Overflow 问题中对以下类型进行了非常详细的探讨:

搭配以下拉链

虽然它的实例的构造有点毛茸茸,但情况确实Zip如此。Comonad也就是说,Zip可以完全机械地派生自Tree并且(我相信)以这种方式派生的任何类型都自动是 a Comonad,所以我认为我们应该可以通用和自动地构造这些类型及其comonads。

实现拉链构造通用性的一种方法是使用以下类和类型族

它(或多或少)出现在 Haskell Cafe 线程和 Conal Elliott 的博客中。此类可以针对各种核心代数类型进行实例化,从而为讨论 ADT 的导数提供了一个通用框架。

所以,最终,我的问题是我们是否可以写

可用于包含上述特定的 Comonad 实例:

不幸的是,我没有运气写出这样的例子。inTo/签名是否outOf足够?是否需要其他东西来限制类型?这种情况甚至可能吗?

0 投票
3 回答
1658 浏览

arrays - 仅将函数应用于Scala中列表或数组中的一个元素

例如,对于任何给定的列表或数组

以及从集合类型映射到集合类型的给定函数,例如

如何应用于orf的第 i 个元素使得listarray

并且

0 投票
1 回答
447 浏览

clojure - 有人可以举例说明 clojure.zip 的编辑功能如何工作吗?

我是 clojure 的新手,我正在使用 clojure.zip,但无法弄清楚如何使用其中的编辑功能。如果有人能给我一个关于它如何工作的工作示例,那将非常有帮助。

比如说我有一棵二叉树

我将如何编辑值 57 并将其更改为 75

0 投票
1 回答
153 浏览

haskell - Haskell:避免树+拉链构造中的堆溢出

我正在尝试实现一个简单的词典压缩算法,它使用确定性有限自动机作为数据结构(实际上它是确定性非循环有限状态自动机,请参阅Wikipedia entry)。当我对一个大型词典数据库运行程序时(我有两个数据集——一个包含 ~900.000 个唯一词,另一个包含 ~4.000.000 个唯一词)我得到一个堆溢出:

我的猜测是问题之一是懒惰addWordaddWords功能。

我已经阅读了seq,$!!,但仍然看不到如何在我的示例中使用它们。如何使代码严格(呃)?另一方面,也许我使用了错误的数据结构(树+拉链)?

这是我正在做的一个(不是很)简短、独立、正确(可编译)的示例。当你运行它时,它应该打印出状态数、转换数和整个 DFA 树,如下所示:

编码: