尝试对构造函数值执行haskell模式匹配

尝试对构造函数值执行haskell模式匹配,haskell,pattern-matching,Haskell,Pattern Matching,我有一个函数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 A

我有一个函数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

这与我的问题相似

您可能关心函数的返回类型
getImage
。(我认为您可能使用了软件包
JuicyPixels
。您可以描述软件包名称而不是模块…)

让我们看看数据类型的定义:

ImageY8 (Image Pixel8)
ImageY16 (Image Pixel16)
您可以看到
getImage(ImageY8 image)
getImage(ImageY16 image)
的返回类型是不同的。前者是
Image Pixel8
,后者是
Image Pixel16

因此,前者函数的类型签名是
DynamicImage->Image Pixel8
,后者是
DynamicImage->Image Pixel16
。 如您所知,一个函数不能具有不同的类型签名


您必须为每个类型签名重命名这两个不同的函数。

您可能关心函数的返回类型
getImage
。(我认为您可能使用了软件包
JuicyPixels
。您可以描述软件包名称而不是模块…)

让我们看看数据类型的定义:

ImageY8 (Image Pixel8)
ImageY16 (Image Pixel16)
您可以看到
getImage(ImageY8 image)
getImage(ImageY16 image)
的返回类型是不同的。前者是
Image Pixel8
,后者是
Image Pixel16

因此,前者函数的类型签名是
DynamicImage->Image Pixel8
,后者是
DynamicImage->Image Pixel16
。 正如您所知,一个函数不能有不同类型的签名


您必须为每个类型签名重命名这两个不同的函数。

您希望
getImage
的类型是什么?编译器正在抱怨,因为一个等式的类型为
DynamicImage->Image Pixel8
,而另一个等式的类型为
DynamicImage->Image Pixel16
,并且这些类型不匹配

你可以写的原因是:

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

是因为这两个方程的类型都是
Shape->Float

您希望
getImage
的类型是什么?编译器正在抱怨,因为一个等式的类型为
DynamicImage->Image Pixel8
,而另一个等式的类型为
DynamicImage->Image Pixel16
,并且这些类型不匹配

你可以写的原因是:

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

因为这两个方程都有type
Shape->Float

更好。我在哪里可以找到它的相关文档?对不起,我的英语坏了。我想在括号中说的是,我猜您使用了
JuicyPixels
,但您没有在问题中指出这一点。有
Codec.Picture
,但它的名字可以被任何其他软件包使用。这就是你想问的吗?果汁更好吗。我在哪里可以找到它的相关文档?对不起,我的英语坏了。我想在括号中说的是,我猜您使用了
JuicyPixels
,但您没有在问题中指出这一点。有
Codec.Picture
,但它的名字可以被任何其他软件包使用。这就是你想问的吗?