【发布时间】:2021-04-30 21:06:01
【问题描述】:
假设我有一个列表xs。 xs 中的每个元素都具有相同的长度(例如,xs 不像 [[1,2],[1],[1,2,3]])。我有一个函数f,它返回一个Bool。我想将f 应用于xs 中的每个2x2 网格并获得应用程序的AND 结果。
例如,
xs = [[1,2,3],[4,5,6],[7,8,9]]
f :: [[Int]] -> Bool
f [[1,_][_,_]] = False
f _ = True
在这种情况下,我想
- 将
f应用到[[1,2],[4,5]]并返回False - 将
f应用到[[2,3],[5,6]]并返回True - 将
f应用到[[4,5],[7,8]]并返回True - 将
f应用到[[5,6],[8,9]]并返回True
那么最终结果应该是False,因为 3 True 和 1 False 结果为 False。
目前我编写了一个函数来帮助我从列表中提取 2x2 网格
get_grid :: [[Int]] -> [[Int]]
get_grid xs = map (take 2) (take 2 xs)
有没有办法通过get_grid 迭代xs 并在每次迭代中应用f 并AND结果?
感谢您的帮助。
【问题讨论】:
-
签名不应该是
get_grid :: [[Int]] -> [[[Int]]],因为有一个列表网格。 -
不,这个函数每次只提取一个网格。所以它只是
[[Int]],而不是网格列表。 -
@AhSoHard,老实说,我没有看到这种模式。我觉得你应该澄清一下。例如,为什么
[[1,3],[4,6]]不是f的可能输入? “xs中的 2x2 网格”对于理解您的意思毫无帮助。 -
@Enlico 它是 2D 网格/矩阵中的 2x2 单元。
-
@Enlico,所以将
xs视为棋盘。您可以将 2x2 单元格/网格视为由 4 个单个/原子正方形组成的 2x2 正方形。所以在这种情况下,[[1,3], [4,6]]不能组成一个 2x2 的正方形,它只能组成两个 1x2 的矩形。因此[[1,3], [4,6]]不是一个有效的案例。很抱歉给您带来任何困惑。