在列表的列表上使用递归

Using recursion on list of lists

我有一个矩阵,它是一个包含九个列表的列表。我的矩阵的直观表示是数独。

我需要 return 数独每个方框 (3x3) 中的数字(或元素)。 例如,这张图片的前三行将表示为

rows = 
[[Just 8, Nothing, Nothing, Just 4, Nothing, Just 6, Nothing, Nothing, Just 7],
[Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Just 4, Nothing, Nothing],
[Nothing, Just 1, Nothing, Nothing, Nothing, Nothing, Just 6, Just 5, Nothing]]

我希望我的函数 return 对于第一个框(以及后来的整个数独)是

[[Just 8, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Just 1, Nothing], ...]

这是我的尝试:我创建了一个函数,它从前三个列表中获取前三个元素并 returns 它们。

getEm :: [[a]] -> [a]
getEm x = concatMap (take 3)(take 3 x)

然后我创建了另一个函数,它将从前三个列表中删除前三个元素

dropEm :: Eq a => [a] -> [a]
dropEm x = delete itemZ listTwo
    where
    listOne = delete itemX x
    listTwo = delete itemY listOne
    itemX = (x!!0)
    itemY = (x!!3)
    itemZ = (x!!6)`

这是我坚持的部分。我的目标是创建一个递归函数,它接受一个矩阵,然后使用 getEm 获取前三个列表(一个框)的前三个元素并将它们添加到新列表 finalList。然后函数dropEm去掉第一个框(前三个列表的前三个元素),然后重复整个过程,直到列表为空,没有"boxes"需要处理。当过程完成时,函数只是 returns finalList.

这是我想出来的,但我不明白如何用我创建的两个函数实现递归部分。

boxs m = case startList of
   [] -> finalList

   where
   startList = (chunksOf 3 (concat m))
   finalList = []

我只是把答案放在这里,因为评论部分可能不适合人们看到它。

import           Data.List       (transpose)
import           Data.List.Split (chunksOf)

subSquares :: Int -> [[a]] -> [[[a]]]
subSquares size = concatMap (chunksOf size)
                . transpose
                . map (chunksOf size)

例如:

λ > rows = [[(x, y) | x <- [0..8]] | y <- [0..8]]
λ > subSquares 3 rows
[[[(0,0),(1,0),(2,0)],[(0,1),(1,1),(2,1)],[(0,2),(1,2),(2,2)]],[[(0,3),(1,3),(2,3)],[(0,4),(1,4),(2,4)],[(0,5),(1,5),(2,5)]],[[(0,6),(1,6),(2,6)],[(0,7),(1,7),(2,7)],[(0,8),(1,8),(2,8)]],[[(3,0),(4,0),(5,0)],[(3,1),(4,1),(5,1)],[(3,2),(4,2),(5,2)]],[[(3,3),(4,3),(5,3)],[(3,4),(4,4),(5,4)],[(3,5),(4,5),(5,5)]],[[(3,6),(4,6),(5,6)],[(3,7),(4,7),(5,7)],[(3,8),(4,8),(5,8)]],[[(6,0),(7,0),(8,0)],[(6,1),(7,1),(8,1)],[(6,2),(7,2),(8,2)]],[[(6,3),(7,3),(8,3)],[(6,4),(7,4),(8,4)],[(6,5),(7,5),(8,5)]],[[(6,6),(7,6),(8,6)],[(6,7),(7,7),(8,7)],[(6,8),(7,8),(8,8)]]]

经过重新整理,得出:

[ [ [(0,0),(1,0),(2,0)]
  , [(0,1),(1,1),(2,1)]
  , [(0,2),(1,2),(2,2)]
  ]
, [ [(0,3),(1,3),(2,3)]
  , [(0,4),(1,4),(2,4)]
  , [(0,5),(1,5),(2,5)]
  ]
, [ [(0,6),(1,6),(2,6)]
  , [(0,7),(1,7),(2,7)]
  , [(0,8),(1,8),(2,8)]
  ]
, [ [(3,0),(4,0),(5,0)]
  , [(3,1),(4,1),(5,1)]
  , [(3,2),(4,2),(5,2)]
  ]
, [ [(3,3),(4,3),(5,3)]
  , [(3,4),(4,4),(5,4)]
  , [(3,5),(4,5),(5,5)]
  ]
, [ [(3,6),(4,6),(5,6)]
  , [(3,7),(4,7),(5,7)]
  , [(3,8),(4,8),(5,8)]
  ]
, [ [(6,0),(7,0),(8,0)]
  , [(6,1),(7,1),(8,1)]
  , [(6,2),(7,2),(8,2)]
  ]
, [ [(6,3),(7,3),(8,3)]
  , [(6,4),(7,4),(8,4)]
  , [(6,5),(7,5),(8,5)]
  ]
, [ [(6,6),(7,6),(8,6)]
  , [(6,7),(7,7),(8,7)]
  , [(6,8),(7,8),(8,8)]
  ]
]

感谢 的初步想法。 :-)