展平二维数组 Haskell
Flattening a 2D array Haskell
我目前有一个 UArray (Int, Int) Char
形式的二维数组,我想将它变成 List
,如下所示:
["ffffffffff",
"ffffffffff",
"ffffffffff",
"ffffffffff",
"ffffffffff",
"ffffffffff",
"ffffffffff",
"ffffffffff",
"ffffffffff",
"ffffffffff"]
每个f
本来就是UArray中的一个字符
其中二维数组中每一行的 Char
被转换为 String
,后者又被解析为 List
这样的 [String]
, 但是,我没有运气使用 Data.Foldable
中的 toList
方法,我应该查看哪些函数来实现这个?
感谢您的帮助!
对于任何索引元组、任何数组类型和任何元素类型,您可以相当多地概括此功能:
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
实例从最小和最大边界构造的。然后你只需在每个索引处获取元素。嵌套列表理解以一种非常好的方式实现了这一点。
我目前有一个 UArray (Int, Int) Char
形式的二维数组,我想将它变成 List
,如下所示:
["ffffffffff",
"ffffffffff",
"ffffffffff",
"ffffffffff",
"ffffffffff",
"ffffffffff",
"ffffffffff",
"ffffffffff",
"ffffffffff",
"ffffffffff"]
每个f
本来就是UArray中的一个字符
其中二维数组中每一行的 Char
被转换为 String
,后者又被解析为 List
这样的 [String]
, 但是,我没有运气使用 Data.Foldable
中的 toList
方法,我应该查看哪些函数来实现这个?
感谢您的帮助!
对于任何索引元组、任何数组类型和任何元素类型,您可以相当多地概括此功能:
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
实例从最小和最大边界构造的。然后你只需在每个索引处获取元素。嵌套列表理解以一种非常好的方式实现了这一点。