Haskell函数不接受参数

时间:2015-12-01 16:44:33

标签: haskell

我写了一个简单的代码来将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吗?

1 个答案:

答案 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 10RgbColor是构造函数,如果您的函数采用Rgb,则必须调用CmykColor