因此,在处理Haskell项目时,我最终编写了以下函数

reGrid :: [[[a]]] -> [[a]]
reGrid [] = []
reGrid xs | any null xs = []
          | otherwise = (concat $ map head xs) : reGrid (map tail xs)


对于那些不讲Haskell的人,这需要一个矩阵列表,并将相应的行连接到一个新的矩阵中。

它在该项目中多次弹出,我感到这是我错过的某种常见操作。

此操作是否有标准名称?在Hoogle中搜索

[[[a]]] -> [[a]


没有任何收益。

最佳答案

您有一堆东西,并且想要将它们变成一件事。通常的方法是折叠。因此,让我们开始:

regrid [] = []
regrid xs = foldr go (repeat []) xs


现在,假设您有一个矩阵,并且还具有重新栅格化其余矩阵的结果。如何将它们结合起来?好吧,您希望将各行合并到一起,直到用完为止,这听起来像是zipWith的一项工作。所以把所有东西放在一起

regrid = foldr (zipWith (++)) []


这不是一个标准函数,但是它很短,并且不会出现部分函数。但是,如果列表很长,则确实存在效率问题。要解决此问题,您可以切换到左折,但是正确设置严格度将非常棘手。我可以稍后再写。

关于haskell - 此操作是否有标准名称?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32851340/

10-13 06:05