我有一个函数getImage,它接受DynamicImage类型的输入并将其更改为图像。功能如下
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
这与我的问题类似。
答案 0 :(得分:5)
您可能会关注函数getImage
的返回类型。 (我想您可能已经使用了包JuicyPixels
。您可以描述包名而不是模块...)
让我们看看数据类型的定义:
ImageY8 (Image Pixel8)
ImageY16 (Image Pixel16)
您可以看到getImage (ImageY8 image)
和getImage (ImageY16 image)
的返回类型不同。前者为Image Pixel8
,后者为Image Pixel16
因此,前一个函数的类型签名是DynamicImage -> Image Pixel8
,后者是DynamicImage -> Image Pixel16
。
如您所知,一个函数不能有不同的类型签名。
您必须为每个类型签名重命名这些两个不同的函数。
答案 1 :(得分:4)
您期望getImage
的类型是什么?编译器抱怨,因为一个等式的类型为DynamicImage -> Image Pixel8
而另一个等式的类型为DynamicImage -> Image Pixel16
,而且这些类型不匹配。
你可以写的原因:
area (Circle r) = …
area (Rectangle a b) = …
是因为两个方程都有Shape -> Float
类型。