4

我开始使用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

有没有其他方法可以提取图像数据?

4

1 回答 1

5

您的方法不起作用,因为img承诺的类型签名会为每个 a人提供一个 Image ,而不仅仅是自己选择的一个人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作为参数,而不需要任何关于它的进一步信息。

于 2012-08-28T10:43:35.183 回答