【发布时间】:2020-06-23 16:34:10
【问题描述】:
我正在尝试实现一个函数来匹配二维网格内 Haskell 中的特定模式。例如,如果我的网格定义如下:
grid = [[0,0,0,0],
[0,1,1,0],
[0,1,1,0],
[0,0,0,0]]
我正在寻找的模式是:
pattern = [[1, 1],
[0, 0]]
我希望它返回网格中左上角元素的索引。在这种情况下,(2,1)。我的函数有以下类型:
matches2d :: Eq a
=> [[a]] -- ^ The 2D grid to match over
-> [[a]] -- ^ The 2D pattern to match
-> [(Int, Int)] -- ^ Top left corner of sections matching the pattern
我不确定如何解决这个问题。我在这里尝试使用的方法是网格上模式的滑动窗口,但我现在一直在尝试实现类似的东西。到目前为止,这是我所拥有的,但我认为我错过了它背后的一些逻辑:
matches2d :: Eq a => [[a]] -> [[a]] -> [(Int, Int)]
matches2d _ [] = []
matches2d f (x:xs) = matcher x pattern
where matcher x y (x:xs) = sort x == sort y
提前感谢您的帮助。
【问题讨论】:
-
有很多小问题会导致函数无法使用。请发布您对定义的尝试,以便我们有一些特定的价值。现在,你的问题太宽泛了。
-
请向我们展示您的一维匹配尝试。你说你可以做一排。显示出来。
-
您还没有向我们展示任何有意义的代码。请向我们展示您暗示可以执行的一维代码。我问这个的原因是因为否则我们不知道是什么阻止你完成任务。我们可以为您发布一些代码,但如果它从您当前水平之上开始,您会在那里理解什么?即使你这样做了,你会从中学到什么?如果你看到
zipWith (zipWith (==) ...) ...之类的东西怎么办,这样的代码对你来说是清楚的吗?它本身就足够暗示了吗?请回复,否则,我们可能会断定您对这个话题失去了兴趣。 -
您的问题还可以重新打开,但我的猜测如果我们从您那里得到一些反馈,它更有可能发生。
-
好吧,既然你已经弄清楚了,你现在可以发布你自己的答案,然后接受它!你也可以获得一些声誉。它现在重新打开,所以你可以这样做。您不必发布整个代码,以防它用于分配;我想,一些亮点和解释就可以了。干杯。
标签: haskell pattern-matching sliding-window