4

Juicy Pixelsライブラリの使用を開始しましたが、分解に問題があります。

タイプがあります:

data DynamicImage =
    ImageY8   (Image Pixel8)
    | ImageYA8  (Image PixelYA8)
    | ImageRGB8 (Image PixelRGB8)
    | ImageRGBA8 (Image PixelRGBA8) 
    | ImageYCbCr8 (Image PixelYCbCr8)

ここで、Pixel*はPixelaクラスのインスタンスです

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

の型署名は、それ自体で選択された特定の1つだけでなく、すべてimgの画像を提供することを約束しているため、このアプローチは機能しません。 aimg

1つの可能性は、型署名を変更して、ポリモーフィックイメージを処理する関数も取得し、それ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

これにより、渡された関数は、それに関する詳細情報なしで、引数としてwithImganyを受け入れることが保証されます。Image

于 2012-08-28T10:43:35.183 に答える