Haskell多态解构

时间:2012-08-28 10:17:05

标签: haskell types polymorphism

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

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

1 个答案:

答案 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作为参数,而无需任何有关它的更多信息。