我开始使用Juicy Pixels库并解决了一些问题。
有类型:
data DynamicImage =
ImageY8 (Image Pixel8)
| ImageYA8 (Image PixelYA8)
| ImageRGB8 (Image PixelRGB8)
| ImageRGBA8 (Image PixelRGBA8)
| ImageYCbCr8 (Image PixelYCbCr8)
其中Pixel *是 Pixel a 类
的实例有些功能适用于图像a 类型,我希望从 DynamicImage 中提取图像a ,但我不能< / p>
当我尝试做类似
的事情img :: (Pixel a) => DynamicImage -> Image a
img (ImageY8 i) = i
img (ImageYA8 i) = i
img (ImageRGB8 i) = i
img (ImageRGBA8 i) = i
img (ImageYCbCr8 i) = i
解释器会出现像
这样的错误Couldn't match type `PixelYCbCr8' with `GHC.Word.Word8'
Expected type: Image b
Actual type: Image Pixel8
In the expression: i
In an equation for `img': img (ImageY8 i) = i
有没有其他方法可以提取图像数据?
答案 0 :(得分:5)
您的方法不起作用,因为img
的类型签名承诺为每个 a
提供一个图像,而不仅仅是img
本身选择的一个特定图像
一种可能性是更改类型签名以使用将处理多态图像的函数,并使用RankNTypes
来允许:
withImg :: DynamicImage -> (forall a. Pixel a => Image a -> b) -> b
withImg (ImageY8 i) f = f i
withImg (ImageYA8 i) f = f i
withImg (ImageRGB8 i) f = f i
withImg (ImageRGBA8 i) f = f i
withImg (ImageYCbCr8 i) f = f i
这确保传递给withImg
的函数将接受任何Image
作为参数,而无需任何有关它的更多信息。