如何根据Haskell中的块变换矩阵

如何根据Haskell中的块变换矩阵,haskell,matrix,Haskell,Matrix,我想要一个函数,它接受一个整数n,一个大小为(n*n)x(n*n),并返回一个矩阵,其中每个块(大小为nxn)现在是一行,通过从左到右,然后从上到下对块进行排序 例如: type Matrix a = [[a]] chunks :: Int -> Matrix a -> Matrix a chunks n = ... 示例:chunk2a==b a b +--+--+ +--+--+ |ab|cd| |ab|ef| |ef|gh|

我想要一个函数,它接受一个整数
n
,一个大小为
(n*n)x(n*n)
,并返回一个矩阵,其中每个块(大小为
nxn
)现在是一行,通过从左到右,然后从上到下对块进行排序

例如:

type Matrix a = [[a]]

chunks :: Int -> Matrix a -> Matrix a
chunks n = ...
示例:
chunk2a==b

   a           b
+--+--+     +--+--+
|ab|cd|     |ab|ef|
|ef|gh|     |cd|gh|
+--+--+ --> +--+--+
|ij|kl|     |ij|mn|
|mn|op|     |kl|op|
+--+--+     +--+--+
示例:
chunks 3c==d

      c                 d
+---+---+---+     +---+---+---+
|abc|def|ghi|     |abc|jkl|stu|
|jkl|mno|pqr|     |def|mno|vwx|
|stu|vwx|yzA|     |ghi|pqr|yzA|
+---+---+---+     +---+---+---+
|BCD|EFG|HIJ|     |BCD|KLM|TUV|
|KLM|NOP|QRS| --> |EFG|NOP|WXY|
|TUV|WXY|Z$%|     |HIJ|QRS|Z$%|
+---+---+---+     +---+---+---+
|...|...|...|     |...|...|...|
|...|...|...|     |...|...|...|
|...|...|...|     |...|...|...|
+---+---+---+     +---+---+---+
***编辑:

答案是:

chunks :: Int -> [[a]] -> [[a]]
chunks n m = concat (map chunks' (splitEvery n m))
    where
        chunks' :: [[a]] -> [[a]]
        chunks' m = map concat (transpose (map (splitEvery n) m))
我想我也应该定义
splitEvery

splitEvery :: Int -> [a] -> [[a]]
splitEvery _ [] = []
splitEvery n xs = chunk : (splitEvery n xxs)
    where
        (chunk, xxs) = splitAt n xs
以下是一些提示:

请注意,某些元素始终保持在一起。例如,在2x2的情况下,
“ab”
保持在一起,
“cd”
“ef”
“gh”
,等等。事实上,您可以通过以下方式可视化转换:

+---+---+          +---+---+
| 1 | 2 |          | 1 | 3 |        1 = ab
| 3 | 4 |          | 2 | 4 |        2 = cd
+---+---+   --->   +---+---+        3 = ef
| 5 | 6 |          | 5 | 7 |        4 = gh
| 7 | 8 |          | 6 | 8 |        5 = ...
+---+---+          +---+---+
并观察每一行如何变换:

1 2   ->   1 3
3 4        2 4

5 6   ->   5 7
7 8        6 8
想想你的线性代数课。进行这些转换吗 看起来眼熟吗?请注意,对角线元素不会移动

现在从
数据列表中查看本节,然后
查看这些功能之一是否适用:


重要的是要了解到目前为止您已经尝试了什么,即使是在不同的编程语言中,以及您遇到的困难。这是家庭作业吗?没关系,多亏了用户5402,我现在算出来了。我没有想到使用
转置
,尽管我已经在程序的其他地方使用了它。不,这不是家庭作业。这是写一个解决数独难题的程序。将数据块包装到列表中非常有用,这样我就可以轻松地对其执行进一步的操作,例如将其转换为多组候选值。在这种情况下,您可能想看看这个实验室),它将指导您逐步在Haskell中构建数独解算器。谢谢,但我不需要它。我已经完成了99%,而且我的算法比他在使用猜测之前做的检查更聪明。我以前的
chunks
函数运行良好,但仅适用于9x9拼图。我只是想要一个可以处理任何大小的拼图的函数。