You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Haskell中如何遍历函数映射的(Coord, Color)键值对?

如何遍历Picture的所有(Coord, Color)映射?

你的Picture类型本质是一个从坐标到颜色的函数,而Coord是整数对(Int×Int),理论上存在无限多可能的坐标值。因此无法直接遍历"所有"映射,必须先限定一个具体的像素范围(比如x从0到10、y从0到5),再遍历这个范围内的所有坐标及其对应颜色。

实现思路

  1. 生成指定范围内的所有Coord:确定x和y的取值区间,生成所有可能的(x,y)组合并包装成Coord类型。
  2. 遍历这些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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 07:14:58