此操作是否有标准名称?
Is there a standard name for this operation?
所以在 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 (++)) []
这不是一个标准函数,但它很短并且不会与部分函数混为一谈。但是,如果列表很长,它确实会出现效率问题。要解决这个问题,您可以切换到左折,但要确保正确的严格性将很棘手。我可以稍后再写。
您的功能与这个非常相似(但不完全相同):
reGrid' = map concat . transpose
例如,我的 QuickCheck 属性 \xs -> reGrid xs == reGrid' xs
出现了这个差异:
*Main> reGrid [[[]],[]]
[]
*Main> reGrid' [[[]],[]]
[[]]
简而言之,您的版本将 "cut off" 更多您可能真正关心(或不关心)的内容。举个更有说服力的例子:
*Main> reGrid [["abc"],[]]
[]
*Main> reGrid' [["abc"],[]]
["abc"]
你可以自己判断不同的情况对你是否重要。
所以在 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 (++)) []
这不是一个标准函数,但它很短并且不会与部分函数混为一谈。但是,如果列表很长,它确实会出现效率问题。要解决这个问题,您可以切换到左折,但要确保正确的严格性将很棘手。我可以稍后再写。
您的功能与这个非常相似(但不完全相同):
reGrid' = map concat . transpose
例如,我的 QuickCheck 属性 \xs -> reGrid xs == reGrid' xs
出现了这个差异:
*Main> reGrid [[[]],[]]
[]
*Main> reGrid' [[[]],[]]
[[]]
简而言之,您的版本将 "cut off" 更多您可能真正关心(或不关心)的内容。举个更有说服力的例子:
*Main> reGrid [["abc"],[]]
[]
*Main> reGrid' [["abc"],[]]
["abc"]
你可以自己判断不同的情况对你是否重要。