问题标签 [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.
scala - Zipper 迭代 Scala 中的列表
这是我之前的问题的后续。我可以使用迭代器、、、fold
和zip
其他迭代器foreach
来迭代 Scala 中的列表。现在我想知道是否有Zipper
最合适的用例。假设我需要没有并发的只读访问。
你能举一个这样的例子并解释为什么Zipper
是最好的选择吗?
scala - 了解为什么 Zipper 是 Comonad
这是我上一个问题的答案的后续。
假设我需要将每个项目映射到a:A
函数并生成。List[A]
b:B
def f(a:A, leftNeighbors:List[A]): B
List[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
是 aMonad
和Zipper
是 a Comonad
。
是否有意义 ?
xml - Scala 中的 XML 转换
我现在正在处理 XML 转换。例如,
- 将所有节点替换
<a>
为<b>
<c x = "xxx">
用<d y="xxx">
等替换所有节点。
我正在使用标准的scala.xml
RewriteRule和RuleTransformer
. 我将其扩展RewriteRule
并传递给一个RuleTransformer
实例,该实例将规则应用于 XML。
我知道还有其他工具可以完成这项工作:lenses
、、zippers
等等。它们可以根据需要转换 XML 吗?与我目前的方法相比,它们有什么优势?
haskell - 有什么证据表明 Clojure 拉链会从以共单胞形式表达中受益?
在本演示文稿[2005] 中,我们在幻灯片 32 处阅读:
zipper 数据类型隐藏了一个comonad。这正是构建属性评估所需要的共同点。
因此,您似乎可以用 Comonads 来表达 Zippers。这在 Scala 中似乎是可能的。
查看zipper 源代码,我们看到 zippers 表示为 Clojure 元数据。
我的问题是,有什么证据表明 Clojure 拉链会从以共单胞形式表达中受益?
Eric 建议这样做的好处是
所以我们需要在原始组上获得所有可能的拉链!
haskell - 如何使二叉树拉链成为 Comonad 的实例?
我想让二叉树拉链成为comonad的实例,但我不知道如何duplicate
正确实现。
这是我的尝试:
一些解释:
BinTree a
是二叉树数据类型,每个树节点都包含一个标签。Partial a
是具有左子树或右子树的二叉树。我的代码中的一堆Partial a
扮演着数据上下文的角色。BTZ
代表BinTree
拉链,我想创建一个实例Comonad
,它由数据上下文和聚焦子树组成。
为了使其成为 的实例Comonad
,我的计划是实现extract
and duplicate
,并通过采用一些随机二叉树来验证共单属性是否成立。
这extract
很简单,只需取出聚焦子树。
函数dup
用作辅助函数,用专注于该节点的树拉链替换每个节点标签。
对于duplicate z
,节点标签必须是z
它自己才能extract . duplicate == id
成立。对于非叶节点,我dup
习惯于处理它们的子树,就好像它们没有父节点一样,然后将当前焦点z
和数据上下文的其余部分附加到这些拉链上。
到目前为止,前两个comonad 属性已满足(extract . duplicate = id
和fmap extract . duplicate
),但我不知道如何处理数据上下文。我目前所做的就是拉上拉链z
并继续往上走。在此过程中,我们采用每个数据上下文堆栈的顶部来构建新的数据上下文堆栈,这听起来是正确的,而且是正确的类型 ( [Partial (BTZ a)]
。但是我的方法不能满足第三定律。
给定上面二叉树拉链的数据类型定义,是否可以使其成为 Comonad 的实例?如果答案是肯定的,那么我的方法有问题吗?
haskell - 拉链共胞,一般
给定任何容器类型,我们可以形成(以元素为中心的)拉链,并且知道这个结构是一个 Comonad。最近在另一个 Stack Overflow 问题中对以下类型进行了非常详细的探讨:
搭配以下拉链
虽然它的实例的构造有点毛茸茸,但情况确实Zip
如此。Comonad
也就是说,Zip
可以完全机械地派生自Tree
并且(我相信)以这种方式派生的任何类型都自动是 a Comonad
,所以我认为我们应该可以通用和自动地构造这些类型及其comonads。
实现拉链构造通用性的一种方法是使用以下类和类型族
它(或多或少)出现在 Haskell Cafe 线程和 Conal Elliott 的博客中。此类可以针对各种核心代数类型进行实例化,从而为讨论 ADT 的导数提供了一个通用框架。
所以,最终,我的问题是我们是否可以写
可用于包含上述特定的 Comonad 实例:
不幸的是,我没有运气写出这样的例子。inTo
/签名是否outOf
足够?是否需要其他东西来限制类型?这种情况甚至可能吗?
arrays - 仅将函数应用于Scala中列表或数组中的一个元素
例如,对于任何给定的列表或数组
以及从集合类型映射到集合类型的给定函数,例如
如何应用于orf
的第 i 个元素使得list
array
并且
clojure - 有人可以举例说明 clojure.zip 的编辑功能如何工作吗?
我是 clojure 的新手,我正在使用 clojure.zip,但无法弄清楚如何使用其中的编辑功能。如果有人能给我一个关于它如何工作的工作示例,那将非常有帮助。
比如说我有一棵二叉树
我将如何编辑值 57 并将其更改为 75
haskell - Haskell:避免树+拉链构造中的堆溢出
我正在尝试实现一个简单的词典压缩算法,它使用确定性有限自动机作为数据结构(实际上它是确定性非循环有限状态自动机,请参阅Wikipedia entry)。当我对一个大型词典数据库运行程序时(我有两个数据集——一个包含 ~900.000 个唯一词,另一个包含 ~4.000.000 个唯一词)我得到一个堆溢出:
我的猜测是问题之一是懒惰addWord
和addWords
功能。
我已经阅读了seq
,$!
和!
,但仍然看不到如何在我的示例中使用它们。如何使代码严格(呃)?另一方面,也许我使用了错误的数据结构(树+拉链)?
这是我正在做的一个(不是很)简短、独立、正确(可编译)的示例。当你运行它时,它应该打印出状态数、转换数和整个 DFA 树,如下所示:
编码: