- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习镜头包。我必须说这是一项相当具有挑战性的任务。
有人能告诉我如何用镜头的 zipper 穿过一棵树吗?特别是,我如何编写一个函数来获取根列表并允许我访问子树的分支?
假设我有这棵树。如果我的输入是 [1, 3]
,该功能应该允许我访问节点 10 和 11。
import Control.Lens
import Data.Tree
import Data.Tree.Lens
testTree = Node 1 [ Node 2 [ Node 4 [ Node 6 [], Node 8 [] ],
Node 5 [ Node 7 [], Node 9 [] ] ],
Node 3 [ Node 10 [],
Node 11 [] ]
]
zipperTree = zipper testTree
saveTape
具体怎么用?和
restoreTape
保存遍历路径(到 StateT 或 IORef)?
最佳答案
编辑:我通常在 ghci 中进行实验以理解新代码,所以对于像我这样的人,我创建了一个 School of Haskell post/page以下示例附带,但它们是可编辑和可运行的。
认为这个例子会回答你的问题,但为了方便起见,我将修改一个不同的节点。我对 zipper 功能的了解
lens比较浅。阅读和习惯
lens包与许多其他包相比,但后来它还不错。在这篇文章之前,我没有使用过镜头包中的 zipper 模块或树形模块。show
的树不太好因此,如果我有时间,我会回来添加一些 pretty-print 输出,否则可能是使用这些示例在 repl 中工作以查看发生了什么的关键。
查看
如果要查看第一个节点的值,根据tree lens package这被称为根,那么您可以:
zipperTree & downward root & view focus
zipperTree & downward root & focus .~ 10 & rezip
downward branches
.这是一个修改第一个分支的根并重新压缩树的示例:
zipperTree & downward branches
& fromWithin traverse
& downward root
& focus .~ 5
& rezip
fromWithin
使用使用
traverse
遍历列表,如果这是一个元组,我可以使用
both
反而。
saveTape
和
restoreTape
允许您将您的位置保存在 zipper 中,以便以后可以恢复。
tape = zipperTree & downward branches
& fromWithin traverse
& downward root
& saveTape
t <- (restoreTape tape testTree)
t & focus .~ 15 & rezip
testTree2 = Node 1 [ Node 2 [] ]
t2 <- (restoreTape tape testTree2)
t2 & focus .~ 25 & rezip
zipper testTree2 & downward root
& focus .~ 11
& upward
& downward branches
& fromWithin traverse
& downward root
& focus .~ 111
& rezip
关于haskell - 带镜头和 zipper 的遍历树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15489324/
我一直试图理解为什么我的代码在一个 zip 上不起作用,而在另一个 zip 上不起作用...... THIS zip 解压 , 和 THIS zipper 没有这是我使用的代码: String zip
我最近才开始使用 Java 处理 zip 文件。到目前为止,一切似乎都计划得很好,但我遇到了最后一个障碍:嵌套 zipper 。 我正在尝试搜索具有特定扩展名的文件,以便将它们作为文本文件读取。到目前
我不确定我的命名法在这里是否正确,但我想知道 Haskell 中是否有一个贪婪的 zip 函数。这意味着如果我有 a = [1, 2, 3] b = [4, 5] zip' a b #=> [(Jus
在 Data.Tree.Zipper 中,玫瑰树的 zipper 数据类型是 data TreePos t a = Loc { _content :: t a -- ^ The
我正在比较 Huet's original paper与 Clojure's implementation并试图弄清楚为什么要进行更改。我是 Clojure 新手,所以如果我对 Clojure 代码的
编辑 #2: 这整个问题和探索都是基于我忽略了 zipper 的基本概念;从特定节点的角度来看,它们代表了数据结构中的一个视角。所以 zipper - 在任何时候 - 一对当前节点以及从该节点的角度来
我正在尝试为长度索引列表实现一种 zipper ,它将返回列表的每个项目与删除该元素的列表配对。例如。对于普通列表: zipper :: [a] -> [(a, [a])] zipper = go [
我有两列,第一列的每个单元格包含以逗号分隔的名字列表,第二列的每个单元格包含以逗号分隔的第二名字列表。我需要将两列“压缩”到第三列,其中包含以逗号分隔的全名列表。 例如: Column A
经过几天的努力,我想我终于明白了如何从连续数据创建它们。 但是,搜索了几天后,我似乎找不到任何有关如何将 zipper 转换成其他东西的资源。基本上,我想将一些数据转换为可以传递给 Hiccup 来生
我正在努力解决lens和 zippers 。考虑在 ghci 中运行的以下代码 > import Control.Lens > import Control.Zipper > > :t within
我对分离的 Highcharts 系列之间的间隙有疑问。 例如,我有一个包含两个系列的图表。一个从(2004年3月1日)开始,另一个从(2009年3月1日)开始。它们彼此不重叠。在图表上显示时,条形图
受到最近关于 Haskell 中二维网格的问题的启发,我想知道是否可以创建一个二维 zipper 来跟踪列表列表中的位置。列表上的一维 zipper 使我们能够真正有效地在大型列表中进行本地移动(常见
我在编写可以遍历异构节点树的 zipper 时遇到问题。我有 i) map 列表。每个映射都有 ii) 一个 :inputs 键,其值是映射列表。 我想使用 zipper 来访问每一片叶子并添加一个计
repl> (-> root zip/down zip/right) [{:answer-keys [5 6], :id 3} {:l [{:id 2, :answer-keys []}], :pno
我有大量(比如 1000 个)可变大小(比如从 4k 到 400k)的 zip,一个 zip 条目。我设法以经典方式解压所有内容,但性能并不真正令人满意...您是否知道可以帮助提高性能的其他方式(ni
我有以下无法编译的代码。 fn main() { let a = "123" .chars() .chain("4566".chars()) .zip(
在为期末考试做一些动态规划问题的练习时,我发现这个问题难倒了我。 Zippers:给定三个字符串,你要判断是否可以将前两个字符串中的字符组合成第三个字符串。前两个字符串可以任意混合,但每个字符在第三个
我有两个要压缩的列表: a = ((1,2,3), (4,5,6), ... ) h = ('a','b', ... ) 一个简单的 zip(a,h) 返回: [ ((1,2,3),'a'), ((4
我正在上传一个 zip 文件,然后我需要在具有相同文件名的路径中提取该文件。所以我使用了Chumper/Zipper为了完成我的任务,我使用了以下代码,即 $zipper->zip('storage
我正在学习镜头包。我必须说这是一项相当具有挑战性的任务。 有人能告诉我如何用镜头的 zipper 穿过一棵树吗?特别是,我如何编写一个函数来获取根列表并允许我访问子树的分支? 假设我有这棵树。如果我的
我是一名优秀的程序员,十分优秀!