展平2D数组Haskell

时间:2015-10-13 18:40:47

标签: arrays list haskell flatten

我目前有一个UArray (Int, Int) Char形式的2D数组,我想把它变成List,如下所示:

["ffffffffff",
"ffffffffff",
"ffffffffff",
"ffffffffff",
"ffffffffff",
"ffffffffff",
"ffffffffff",
"ffffffffff",
"ffffffffff",
"ffffffffff"]

每个f最初都是UArray中的一个角色。

将2D数组中每一行的Char转换为String,然后将List解析为[String] toList ,我对Data.Foldable的{​​{1}}方法没有运气,我应该考虑哪些功能来实现这一目标?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

对于任何索引元组,任何数组类型和任何元素类型,您可以相当多地概括此功能:

import Data.Array.Unboxed 

flatten2D :: (Enum i0, Enum i1, Ix i0, Ix i1, IArray arr x) 
          => arr (i0, i1) x -> [[x]]
flatten2D arr = [ [ arr ! (i0, i1) | i0 <- [min0..max0] ] | i1 <- [min1..max1] ]
  where ((min0, min1), (max0, max1)) = bounds arr 

实现很简单:索引列表是使用Enum实例从最小和最大边界构造的。然后你只需在每个索引处获取元素。嵌套列表理解以非常好的方式实现了这一点。