我开始使用Juicy Pixels库,但在解构时遇到了一些问题。
有以下类型:
data DynamicImage =
ImageY8 (Image Pixel8)
| ImageYA8 (Image PixelYA8)
| ImageRGB8 (Image PixelRGB8)
| ImageRGBA8 (Image PixelRGBA8)
| ImageYCbCr8 (Image PixelYCbCr8)
Pixel*是一个Pixel类的实例集合。
有一些函数适用于Image a类型,我希望从DynamicImage中提取Image a,但我却无法做到。
当我尝试做像这样的事情时
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
有没有其他方法可以提取图像a的数据?
存在 a. Pixel a => DynamicImage -> Image a
转换成延续传递风格。 - Ptharien's Flamedata SomeImage = forall a. Pixel a => SomeImage (Image a)
(需要-XExistentialQuantification
)。 - VitusDynamicImage -> (exists a. Pixel a => Image a)
的转换 - 请注意exists
的位置。**(b)**exists a. Pixel a => DynamicImage -> Image a
在某种意义上比较强大,因为你可以从b到a,但反过来不行。 - Vitus