2016-10-04 77 views
1

我有一個函數getImage,它接受DynamicImage類型的輸入並將其更改爲圖像。功能如下嘗試在構造函數值上執行haskell模式匹配

getImage (ImageY8 image) = image 
getImage (ImageY16 image) = image 

以上定義來自Codec.Picture模塊。但它給了我一個錯誤:

Couldn't match type ‘GHC.Word.Word16’ with ‘GHC.Word.Word8’ 
    Expected type: Image Pixel8 
     Actual type: Image Pixel16 
    In the expression: image 
    In an equation for ‘getImage’: getImage (ImageY16 image) = image 
Failed, modules loaded: none. 

這是爲什麼不工作,我可以做到以下幾點:

data Shape = Circle Float | Rectangle Float Float 

area (Circle r) = 3.14 * r * r 
area (Rectangle a b) = a * b 

這是類似我的問題。

回答

4

您可能會考慮函數getImage的返回類型。 (我想你可能已經使用了包JuicyPixels您可以描述的,而不是該模塊的包名......。)

讓我們看到的數據類型的定義:

ImageY8 (Image Pixel8) 
ImageY16 (Image Pixel16) 

你可以看到返回getImage (ImageY8 image)getImage (ImageY16 image)的類型是不同的。前者是Image Pixel8,後者是Image Pixel16
因此,前函數的類型簽名是DynamicImage -> Image Pixel8,後者是DynamicImage -> Image Pixel16。如你所知,一個函數不能有不同的類型簽名。

您必須爲每個類型簽名重命名這些兩個不同的函數。

+0

JuicyPixels更好。我在哪裏可以找到它的proprer文檔? –

+0

對不起,我的英文被打破了。我想在括號中說,我猜你已經使用了「JuicyPixels」,但你沒有在你的問題中指出它。有'Codec.Picture',但它的名字可以被任何其他軟件包使用。 這是你想問的嗎? – QuietJoon

4

你認爲getImage的類型是什麼?編譯器正在抱怨,因爲一個方程的類型爲DynamicImage -> Image Pixel8,另一個方程的類型爲DynamicImage -> Image Pixel16,而這些類型不匹配。

你可以寫的原因是:

area (Circle r) = … 
area (Rectangle a b) = … 

是因爲這兩個公式的類型爲Shape -> Float