我写了一个简单的代码来将rgb转换为cmyk。然后我定义了数据类型testdb
。
现在我收到了这个错误:
Color
我认为Couldn't match expectet type `Color' with actual type `(t0, t1, t2)'
会引用Color
。我做错了什么?
我的代码:
Rgb(Int,Int,Int)
data Color = Rgb (Int,Int,Int) | Cmyk Double Double Double Double deriving (Show)
rgb2cmyk :: Color -> Color
rgb2cmyk (Rgb (0,0,0)) = (Cmyk 0 0 0 1)
rgb2cmyk (Rgb (r,g,b)) = (Cmyk c m y k)
where
rd = (fromIntegral r)/255
gd = (fromIntegral g)/255
bd = (fromIntegral b)/255
w = max3 rd gd bd
c = w - rd/w
m = w - gd/w
y = w - bd/w
k = 1 - w
max3 :: Double -> Double -> Double -> Double
max3 a b c | a>=b && a>=c = a
| b>=a && b>=c = b
| otherwise = c
test1 = rgb2cmyk 233 123 123
行中出现错误。我必须写test1
吗?
答案 0 :(得分:2)
我建议保留语法,保留Rgb Int Int Int
而不是Rgb (Int,Int,Int
)
data Color = Rgb Int Int Int | Cmyk Double Double Double Double deriving (Show)
rgb2cmyk :: Color -> Color
rgb2cmyk (Rgb 0 0 0) = (Cmyk 0 0 0 1)
rgb2cmyk (Rgb r g b) = (Cmyk c m y k)
where
(...)
*Main> rgb2cmyk $ Rgb 0 0 0
Cmyk 0.0 0.0 0.0 1.0
解释评论:
您无法将rgb2cmyk
称为rgb2cmyk x y z
,该功能需要Rgb x y z
,因此您必须将其称为rgb2cmyk Rgb 10 10 10
。 Rgb
是Color
是构造函数,如果您的函数采用Rgb
,则必须调用Cmyk
或Color
。