- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑:最初的问题是“用 comonad 打结”,但这里真正有帮助的是与 cirdec 中的 U2Graph
打结的二维结。 。 原始问题(直到 Anwser):
我想与源自 comonad 的数据结合起来
data U a = U [a] a [a]
进入更丰富的数据结构
data FullCell = FullCell {
vision :: [[Int]],
move :: Int -> Maybe FullCell -- tie the knot here!
}
有一个函数
tieKnot :: U Int -> U FullCell
但是,当我尝试填写 undefined
时,我的大脑遇到了“发生检查”:
tieKnot :: U Int -> U FullCell
tieKnot u = u =>> (\z -> FullCell {
vision = limitTo5x5 z,
move = move'
}) where
move' 1 = Just undefined -- tie the knot to neighbor here
move' (-1) = Just undefined -- ...
move' _ = Nothing
limitTo5x5 = undefined -- not of interest, but the cause why a comonad is used
我无法解决的问题是,我需要引用我刚刚构建的东西,并且它被深埋在comonad中。我想真正确定圆圈实际上指向同一个重击。
解决这个问题的最佳方法是什么?那 comonad U a
是正确的选择吗?双向链表 data T a = T (Maybe (T a)) a (Maybe (T a))
似乎会遇到同样的问题,但扩展到二维会更困难。
背景:我尝试实现codegolf's rat race在 haskell 。因此,由于计算耗时,我想通过 tying-the-know 来引用同一个 thunk。
解决方案来自Cirdec's Answer 。它只是缺少一个我不想挤进评论的一小步。
导致我的大脑遇到“发生检查”的原因是:要构造一个 FullCell
并在其字段上打结move
,我需要已经构造的 >U2Graph FullCell
。既然我已经说过了,这个需求很容易写成:
toU2Graph :: (U2Graph b -> a -> b) -> U2 a -> U2Graph b
其中第一个参数是构造我的 FullCell
的函数。 Circdec 的功能可以轻松调整。最后一步是将 comonad 重新引入:
toU2GraphW :: (U2Graph b -> U2 a -> b) -> U2 a -> U2Graph b
toU2GraphW f u = toU2Graph f (duplicate u)
最佳答案
可以从 zipper 构建图表,这样在图表上移动就不需要分配新的内存。如果您要保留指向该结构的多个指针,这可能会提高性能。
我们将从列表的 zipper 开始。
data U a = U [a] a [a]
相应的图表保存对左侧和右侧节点的引用(如果存在)。
data UGraph a = UGraph {
_left :: Maybe (UGraph a),
_here :: a,
_right :: Maybe (UGraph a)
}
此结构的任何实例都应遵守以下定律,即朝一个方向走然后返回另一个方向会将您带回起点。
_right >=> _left == \x -> (_right >=> const (return x)) x
_left >=> _right == \x -> (_left >=> const (return x)) x
UGraph
数据类型不强制执行此操作,因此明智的做法是将其放入模块中而不是导出 UGraph
构造函数。
要将 zipper 转换为图表,我们从中间开始,然后从两侧开始。我们在图表的已构建部分和图表的尚未构建部分之间系上递归结。
toUGraph :: U a -> UGraph a
toUGraph (U ls h rs) = g
where
g = UGraph (build ugraph' g ls) h (build UGraph g rs)
ugraph' r h l = UGraph l h r
build _ _ [] = Nothing
build f prev (here:next) = Just g
where
g = f (Just prev) here (build f g next)
与 my other answer 结合,您可以构建 U Int
的可见部分的图表。与
tieKnot :: U Int -> UGraph [[Int]]
tieKnot = toUGraph . extend limitTo5x5
最终您想要构建一个二维场。像我们在二维中为一维列表 zipper 所做的那样构建图表要困难得多,并且通常需要强制 O(n^2)
遍历任意长度路径的内存 n
.
您计划使用 two-dimensional list zipper Dan Piponi described ,所以我们将在这里重现它。
data U2 a = U2 (U (U a))
我们可能会想为 U2
制作一个图表。这是一个直接的模拟
data U2Graph a = U2Graph (UGraph (UGraph a))
它的结构相当复杂。相反,我们要做一些更简单的事情。对应于U2
的图的节点将保存对四个基本方向中每个方向上的相邻节点的引用(如果这些节点存在)。
data U2Graph a = U2Graph {
_down2 :: Maybe (U2Graph a),
_left2 :: Maybe (U2Graph a),
_here2 :: a,
_right2 :: Maybe (U2Graph a),
_up2 :: Maybe (U2Graph a)
}
U2Graph
的实例应该遵循我们为 UGraph
定义的相同双向迭代器定律。再一次,该结构本身并不执行这些法律,因此 U2Graph
构造函数可能不应该被公开。
_right2 >=> _left2 == \x -> (_right2 >=> const (return x)) x
_left2 >=> _right2 == \x -> (_left2 >=> const (return x)) x
_up2 >=> _down2 == \x -> (_up2 >=> const (return x)) x
_down2 >=> _up2 == \x -> (_down2 >=> const (return x)) x
在我们转换 U2 a
之前到 U2Graph a
,我们看一下U2 a
的结构。我将把外部列表指定为左右方向,将内部列表指定为上下方向。一个U2
书脊贯穿整个数据,焦点沿着书脊的任何位置。每个子列表都可以垂直于书脊滑动,以便它聚焦于子列表上的特定点。一个U2
在使用过程中可能如下所示。 +
s 是外脊柱,垂直破折号 |
是内刺,*
是结构的焦点。
|
||
||| ||
|||| |||| |
+++*++++++++
|||||| ||
||||
||
每个内部脊柱都是连续的 - 不能有间隙。这意味着,如果我们考虑远离脊柱的位置,则只有在靠近脊柱的位置在该侧也有邻居的情况下,它才能在左侧或右侧有邻居。这导致了我们将如何构建 U2Graph
。我们将沿着外脊柱建立左右连接,并递归引用回到焦点,就像我们在 toUGraph
中所做的那样。 。我们将沿着内部脊柱建立上下连接,并递归引用回脊柱,就像我们在 toUGraph
中所做的那样。 。为了建立从内部脊柱上的节点到左侧和右侧的连接,我们将向外部脊柱靠近一步,在该节点处向侧面移动,然后在相邻内部脊柱上远离外部脊柱一步.
toU2Graph :: U2 a -> U2Graph a
toU2Graph (U2 (U ls (U ds h us) rs)) = g
where
g = U2Graph (build u2down g ds) (build u2left g ls) h (build u2right g rs) (build u2up g us)
build f _ [] = Nothing
build f prev (here:next) = Just g
where
g = f (Just prev) here (build f g next)
u2up d h u = U2Graph d (d >>= _left2 >>= _up2 ) h (d >>= _right2 >>= _up2 ) u
u2down u h d = U2Graph d (u >>= _left2 >>= _down2) h (u >>= _right2 >>= _down2) u
u2left r (U ds h us) l = g
where
g = U2Graph (build u2down g ds) l h r (build u2up g us)
u2right l (U ds h us) r = g
where
g = U2Graph (build u2down g ds) l h r (build u2up g us)
关于haskell - 在 2 维中喜结连理(原为 : tying the knot with a comonad),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28516819/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!