因此,在处理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/