使用Haskell的hip库逐像素生成图像的类型签名问题
Haskell hip库图像生成的函数修正与类型签名说明
问题修复步骤
1. 修正fun函数的语法与类型错误
你的fun函数存在语法错误(括号不匹配、参数传递方式错误)和类型不匹配问题。Pixel RGB Word8需要三个Word8类型的参数,而直接对fromIntegral的结果做除法得到的是浮点数,需要先映射到Word8的0-255范围再转换类型。
修正后的fun:
import Codec.Picture fun :: (Int, Int) -> Pixel RGB Word8 fun (i, j) = PixelRGB r g b where -- 将Int转为浮点数计算比例,再映射到0-255区间后转为Word8 r = fromIntegral $ round $ fromIntegral i / 400 * 255 g = fromIntegral $ round $ fromIntegral j / 400 * 255 b = fromIntegral $ round $ fromIntegral (i + j) / 400 * 255
2. 确定gradColor的类型签名
makeImageR VU (m, n) fun返回的是Image PixelRGB8类型(Pixel RGB Word8是PixelRGB8的完整写法,VU代表使用非装箱向量存储像素)。因此gradColor的类型签名为:
gradColor :: (Int, Int) -> Image PixelRGB8 gradColor (m, n) = makeImageR VU (m, n) fun
完整可运行代码
import Codec.Picture fun :: (Int, Int) -> Pixel RGB Word8 fun (i, j) = PixelRGB r g b where r = fromIntegral $ round $ fromIntegral i / 400 * 255 g = fromIntegral $ round $ fromIntegral j / 400 * 255 b = fromIntegral $ round $ fromIntegral (i + j) / 400 * 255 gradColor :: (Int, Int) -> Image PixelRGB8 gradColor (m, n) = makeImageR VU (m, n) fun main :: IO () main = writeImage "images/grad_color.png" $ gradColor (200, 200)
内容的提问来源于stack exchange,提问作者Stéphane Laurent
相关产品推荐
相关产品推荐

