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)
有没有其他方法来提取图像数据?
你的方法不起作用,因为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作为参数,而无需任何关于它的进一步信息.
| 归档时间: |
|
| 查看次数: |
245 次 |
| 最近记录: |