【问题标题】:Haskell iterate through each 2x2 grid over a list of list and apply functionHaskell 遍历列表中的每个 2x2 网格并应用函数
【发布时间】:2021-04-30 21:06:01
【问题描述】:

假设我有一个列表xsxs 中的每个元素都具有相同的长度(例如,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 并在每次迭代中应用fAND结果?

感谢您的帮助。

【问题讨论】:

  • 签名不应该是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]] 不是一个有效的案例。很抱歉给您带来任何困惑。

标签: list haskell


【解决方案1】:

如果你编写一个函数来从列表中获取所有相邻的对:

pairs :: [a] -> [[a]]
pairs (x:y:rest) = [x,y] : pairs (y:rest)
pairs _ = []

您可以将其应用于您的矩阵,以使相邻行对的子矩阵保持一致:

> pairs xs
[[[1,2,3],[4,5,6]],[[4,5,6],[7,8,9]]]

转置这些子矩阵中的每一个:

> map transpose . pairs $ xs
[[[1,4],[2,5],[3,6]],[[4,7],[5,8],[6,9]]]

然后像以前一样将它们拆分为成对行的子矩阵:

> concatMap pairs . map transpose . pairs $ xs
[[[1,4],[2,5]],[[2,5],[3,6]],[[4,7],[5,8]],[[5,8],[6,9]]]

并将它们转回:

> map transpose . concatMap pairs . map transpose . pairs $ xs
[[[1,2],[4,5]],[[2,3],[5,6]],[[4,5],[7,8]],[[5,6],[8,9]]]

这些是您想要的矩阵,您可以通过以下方式检查f 是否适用于所有矩阵:

> all f . map transpose . concatMap pairs . map transpose . pairs $ xs
False

一个完整的例子:

import Data.List

pairs :: [a] -> [[a]]
pairs (x:y:rest) = [x,y] : pairs (y:rest)
pairs _ = []

f :: [[Integer]] -> Bool
f [[1,_],[_,_]] = False
f _ = True

xs :: [[Integer]]
xs = [[1,2,3],[4,5,6],[7,8,9]]

ys :: [[Integer]]
ys = [[0,2,3],[4,5,6],[7,8,9]]

check_grid :: ([[a]] -> Bool) -> [[a]] -> Bool
check_grid f = all f . map transpose . concatMap pairs . map transpose . pairs

main = do
  print $ check_grid f xs
  print $ check_grid f ys

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 2018-02-02
    • 2023-02-10
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多