将列表转换为矩阵(Haskell)

时间:2018-10-31 19:00:47

标签: haskell matrix

我正在尝试从接收Int(i)的函数将列表转换为数组(列表的列表),该Int(i)始终是从0开始的计数器,而另一个Int(n)则是每个数组的长度行和要转换为矩阵的列表。

createMatrix :: (Int, Int, [Int]) -> [[Int]]
createMatrix (i, n, ([])) = []
createMatrix (i, n, (x:y)) = if (i < n) then [x] : createMatrix (i+1, n, (y))
                            else  [] ++ createMatrix (0, n, (x:y))

这给出了我的输出:

[[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18]]

什么时候应该是这样的:

[[1,2,3,4,5,6],[7,8,9,10,11,12],[13,14,15,16,17,18]]

如果n为6

有人认为我可能会失败吗?我尝试了几件事,但没有找到解决方法。

谢谢

2 个答案:

答案 0 :(得分:2)

编写[x]:createMatrix (...)时,您总是在输出中添加一个完整的新列表。而且,当您执行[] ++ createMatrix (...)时,您并没有对结果做任何事情; concat空列表无济于事。

您想将x放在createMatrix (...)结果的第一个列表中,而不是将[x]放在整个结果的前面。

else情况下,您希望添加一个新的空列表,而不是尝试使用将两个列表连接在一起的++

答案 1 :(得分:1)

没有counter且仅对每个给定的n拆分列表的替代解决方案:

matrixEvery :: Int -> [a] -> [[a]]
matrixEvery _ [] = []
matrixEvery n xs = as : matrixEvery n bs
  where (as,bs) = matrixEvery n xs

使用递归而不是传递计数器。 唯一的失败是,如果您想使矩阵的大小都相等,那将行不通,但请您靠近:)