- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有一段时间我一直想知道如何有效地完成此操作,但由于某种原因我无法做到这一点。我需要建立一个矩形网格模型,其中每个字段都包含一些数据。
我需要通过 zipper 访问它,其中我的焦点是一个字段(可以说是值)。 zipper 应支持 goDown
、goUp
、goLeft
和 goRight
操作,每个操作都会将焦点更改为指示的方向,以及这里
,它应该返回当前焦点下的字段的值。
虽然这可以通过 Map
来完成,但它的效率很低,因为改变焦点需要 log n
时间,n
是Map
中的元素数量,因为 Map
具有对数查找时间。
我需要在 O(1)
时间内执行指示的操作。
出于说明目的,请查看下面的矩阵。括号内的数字是当前焦点。
1 (2) 3
4 5 6
7 8 9
如果我应用了goRight
,我应该得到:
1 2 (3)
4 5 6
7 8 9
如果我现在这里
申请,返回的值应该是3
。
上面解释的表单上的数据类型在 haskell 中看起来如何?它可以作为代数数据类型实现吗?
请记住,在所有四个方向上焦点的变化应该可以在 O(1)
时间内完成,并且可以读取当前焦点中的值。
最佳答案
好吧,我很失望,没有人对这个问题给出“正确”的答案,因为我知道它存在,但我无法很好地解释它。我的回答是基于http://blog.sigfpe.com/2006/12/evaluating-cellular-automata-is.html
首先,一个标准,即一维 zipper 可以是:
Data U x = U [x] x [x]
第一个元素是焦点“左”的所有元素的反向列表,然后是焦点元素,然后是焦点“右”的所有元素的列表。例如:
U [-1,-2,-3] 0 [1,2,3]
然后我们可以左右移动 zipper 。当我们冲出网格边缘时,你必须决定该怎么做。原始帖子只是假设了一个无限网格,以便将极端情况留给读者作为练习。
left (U (a:as) x zs) = U as a (x:zs)
right (U as x (z:zs)) = U (x:as) z zs
现在所有看起来像容器的东西都应该是仿函数,所以:
instance Functor U where
fmap f (U a x z) = U (map f a) (f x) (map f z)
在这一点上,我真的希望其他人能介入解释我要做什么以及为什么。我将使 U
成为 Control.Comonad
的实例。我能解释的最好的解释是,comonad 是一种由内而外的 monad。 Comonads 不是给你一个元素并要求你创建一个具有新值的容器 (>>=::Monad m => m a -> (a -> m b) -> m b)
您可以获取整个结构,只询问属于焦点的值: (=>>)::Comonad w=>w a -> (w a -> b) -> w
因此使用comonad-3.0.2包中Control.Comonad的条款:
Instance Comonad U where
-- extract :: U a -> a -- called coreturn in the post
extract (U _ x _) = x
-- duplicate :: U a -> U (U a) -- called cojoin in the post
duplicate x = U (tail $ iterate left x) x (tail $ iterate right x)
重复给你一个 zipper zipper ,每个 zipper 比最后一个向左或向右移动一个元素。它看起来像是一个巨大的内存量,但 Haskell 很懒,实际的内存占用非常小,对于完整的集合来说约为 O(n),如果你根本不环顾四周,则约为 O(1)。
但这只是一个维度。再次由于我不够聪明,无法解释将其扩展到二维的原因,这非常容易:
data U2 x = U2 (U(U x))
instance Functor U2 where
fmap f (U2 y) = U2 $ fmap (fmap f) y
instance Comonad U2 where
extract (U2 y) = extract (extract y)
duplicate (U2 y) = fmap U2 $ U2 $ roll $ role y where
iterate' f = tail . iterate f
role x = U (iterate' (fmap left) x) x (iterate' (fmap right) x)
复制函数现在创建一个网格网格,每个网格都适当移动。所以
goLeft u = let (U _ (U x _ _) _) = duplicate u in x
goRight u = let (U _ (U _ _ x) _) = duplicate u in x
goUp = left . duplicate
goDown = right . duplicate
here = extract
因为 Haskell 很懒,所有这些都是 O(1) 函数。更有趣的是,您可以在此处
更改时间和内存的 O(1) 成本,并在计算中使用邻域单元。这使得实现像生命游戏
细胞自动机一样简单
rule (U2 (U
(U (u0:_) u1 (u2:_):_)
(U (u3:_) u4 (u5:_))
(U (u6:_) u7 (u8:_):_))) =
let n = length $ filter id [u0,u1,u2,u3,u5,u6,u7,u8] in
u4 && (n==2 || n==3) || (not u4) && n==3
-- assume u is the original graph each step is
step u = u =>> rule
除了上面的博文之外,我建议在 Google 上搜索 Comonad 以了解更多信息,特别是因为我不是最擅长解释这些内容的人。
关于haskell - 在haskell中制作类似网格的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15874398/
学习SQL。有一个简单的带有字段标题的桌面游戏。我想根据标题进行搜索。如果我有一款名为 Age of Empires III: Dynasties 的游戏,并且我使用 LIKE 和参数 Age of
我正在尝试为以下数据结构创建镜头。我正在使用lens-family . data Tree = Tree { _text :: String, _subtrees ::
我发现很难理解这一点。比如说,在 Python 中,如果我想要一个根据用户输入在循环中修改的列表,我会有这样的内容: def do_something(): x = [] while(
我有一个像这样的 mysql 查询 SELECT group_name FROM t_groups WHERE group_name LIKE '%PCB%'; 结果是 group_name ----
我的数据库表中有超过一百万条记录。当我使用like时非常慢,当我使用match against时他们丢失了一些记录。 我创建帮助表: 标签列表 tag_id tag_name tag_rel_me
我在我的一个 Java 项目中使用 JXBrowser 来简单显示 googlemaps 网页,以便我可以在那里跟踪路线,但最近我想改进该项目,但我的问题是 JXBrowser 的许可证过期(只有一个
小问题:如何将 mysql_escape_string 变量包含在 like 子句中? "SELECT * FROM table WHERE name LIKE '%". %s . "%'" 或
我尝试使用几个jquery消息插件,例如alertify . 但我注意到的主要事情是系统消息框会停止后台功能,直到用户响应。其他插件没有此功能。 有没有办法将此功能添加到 jquery 插件中?可以扩
我是 Ruby 新手。我过去使用过 shell。我正在将 shell 程序转换为 ruby。我有以下命令 cmd="cat -n " + infile + " | grep '127.0.0.1
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
当我研究 Rust 时,我试图编写一个 Rust 函数来查看任何可迭代的字符串。 我最初的尝试是 fn example_1(iter: impl Iterator); fn example_2(ite
我必须在我的项目中使用代码拆分。但无论如何,第一次初始下载有一些代码。 现在我想向最终用户展示代码下载(.cache.html - 或其他代码拆分)的进度,例如 gmail 启动进度。 请你帮帮我。
我今天找到了一个错误,它最终是由我代码中的以下片段引起的(我试图在列表中仅过滤“PRIMARY KEY”约束): (filter #(= (% :constraint_type "PRIMARY KE
我正在尝试在关键字段上实现检查约束。关键字段由 3 个字符的前缀组成,然后附加数字字符(可以手动提供,但默认是从序列中获取整数值,然后将其转换为 nvarchar)。关键字段定义为 nvarhcar(
我正在尝试使用以下方式创建 List 实例: List listOne = new ArrayList(); List listTwo = new ArrayList(){}; List listTh
我过去曾为 iOS 开发过,最近转向了 mac 开发。我开始了一个“感受”事物的项目,但遇到了一个问题。我试图创建一个 NSTableView 来显示多个项目,包括一个标签、一个 2 UIImageV
我正在尝试编写一个查询,该查询将返回哪些主机缺少某个软件: Host Software A Title1 A
AFAIK,在三种情况下别名是可以的 仅限定符或符号不同的类型可以互为别名。 struct 或 union 类型可以为包含在其中的类型设置别名。 将 T* 转换为 char* 是可以的。 (不允许相反
\s 似乎不适用于 sed 's/[\s]\+//' tempfile 当它为工作时 sed 's/[ ]\+//' tempfile 我正在尝试删除由于命令而出现在每行开头的空格: nl -s ')
我正在使用 ocamlgraph 在 ocaml 中编写程序,并想知道是否要将其移植到 F# 我有哪些选择?谢谢。 最佳答案 QuickGraph .Net 最完整的图形库之一 关于F# 图形库(类似
我是一名优秀的程序员,十分优秀!