Haskell中的RGB到CMYK

时间:2015-10-23 08:30:04

标签: haskell

我倾向于将给定的RGB颜色转换为CMYK格式,如果是白色(0,0,0),我应该得到(0,0,0,1)。我整个晚上都在尝试,但每次崩溃都可以取悦有人说出错了什么?

    rgb2cmyk :: (Int,Int,Int) -> (Float,Float,Float,Float)
    rgb2cmyk (r,g,b) = (c,m,y,k)
        | (r,g,b) == (0,0,0) = (0,0,0,1)
        | otherwise          = ((w - (r/255))/w, (w - (g/255))/w, (w - (b/255))/w, 1 - w)
                               where
                                w = maximum [r/255, g/255, b/255]

我得到:parse error on input '|'

2 个答案:

答案 0 :(得分:2)

你想说要么

rgb2cmyk (r, g, b) = ...

rgb2cymk (r, g, b)
  | ... = ...
  | ... = ...

但不是两个在同一时间。 (它会执行哪个表达式?)

顺便说一句,你实际上并不需要测试(r,g,b) == (0,0,0);你可以直接模仿匹配(0,0,0)

rgb2cymk (0,0,0) = (0,0,0,1)
rgb2cymk (r,g,b) = ???

答案 1 :(得分:1)

= (c, m, y, k)中的rgb2cmyk (r,g,b) = (c,m,y,k)部分不正确。

使用警卫时,您应该将其视为使用

之类的东西
rgb2cmyk (r,g,b) = case (r,g,b) of
           (0,0,0) -> (0,0,0,1)
           _       -> ...

因为这就是GHC实际上会重写你的守卫(这与if相同,后者变为case predicate of...)。

是没有意义的
rgb2cmyk (r,g,b) = (c,m,y,k)

然后又有了:

case (r,g,b) of ...

作为源文件中的浮动定义。