Haskell多态解构

hai*_*hum 4 polymorphism haskell types

我开始使用Juicy Pixels库并且解构时遇到一些问题.

有类型:

data DynamicImage =
    ImageY8   (Image Pixel8)
    | ImageYA8  (Image PixelYA8)
    | ImageRGB8 (Image PixelRGB8)
    | ImageRGBA8 (Image PixelRGBA8) 
    | ImageYCbCr8 (Image PixelYCbCr8)
Run Code Online (Sandbox Code Playgroud)

Pixel*是Pixel类的实例

有一些函数可以使用Image一个类型,我希望从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
Run Code Online (Sandbox Code Playgroud)

口译员会发生类似的错误

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
Run Code Online (Sandbox Code Playgroud)

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

Joa*_*ner 5

你的方法不起作用,因为imgpromises 的类型签名为每个人 提供了一个Image 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
Run Code Online (Sandbox Code Playgroud)

这确保传递给的函数withImg将接受任何Image作为参数,而无需任何关于它的进一步信息.

  • 这实际上是对`存在的'的转换.像素a => DynamicImage - >图像a`为延续传递样式. (3认同)