Haskell中如何遍历函数映射的(Coord, Color)键值对?
如何遍历Picture的所有(Coord, Color)映射?
你的Picture类型本质是一个从坐标到颜色的函数,而Coord是整数对(Int×Int),理论上存在无限多可能的坐标值。因此无法直接遍历"所有"映射,必须先限定一个具体的像素范围(比如x从0到10、y从0到5),再遍历这个范围内的所有坐标及其对应颜色。
实现思路
- 生成指定范围内的所有
Coord:确定x和y的取值区间,生成所有可能的(x,y)组合并包装成Coord类型。 - 遍历这些
Coord,调用Picture的函数得到对应Color,组合成(Coord, Color)对。
具体代码实现
首先编写辅助函数,生成指定矩形范围内的所有坐标:
-- 生成x从xMin到xMax(包含两端)、y从yMin到yMax(包含两端)的所有Coord generateCoords :: Int -> Int -> Int -> Int -> [Coord] generateCoords xMin xMax yMin yMax = [Coord x y | x <- [xMin..xMax], y <- [yMin..yMax]]
再编写遍历函数,输入Picture和坐标范围,返回该范围内的所有(Coord, Color)对:
-- 遍历指定范围内的所有(Coord, Color)映射 traversePicture :: Picture -> Int -> Int -> Int -> Int -> [(Coord, Color)] traversePicture (Picture getColor) xMin xMax yMin yMax = [(coord, getColor coord) | coord <- generateCoords xMin xMax yMin yMax]
测试示例
先定义一个测试用的Picture,让每个坐标的RGB值等于x、y、x+y(取模256避免超出0-255范围):
testPicture :: Picture testPicture = Picture (\(Coord x y) -> Color (x `mod` 256) (y `mod` 256) ((x + y) `mod` 256))
调用遍历函数,获取x从0到2、y从0到1的所有映射:
main :: IO () main = mapM_ print $ traversePicture testPicture 0 2 0 1
运行后输出结果:
(Coord 0 0,Color 0 0 0) (Coord 0 1,Color 0 1 1) (Coord 1 0,Color 1 0 1) (Coord 1 1,Color 1 1 2) (Coord 2 0,Color 2 0 2) (Coord 2 1,Color 2 1 3)
内容的提问来源于stack exchange,提问作者coderodde
相关产品推荐
相关产品推荐

