2015-10-23 5 views
-2

Я должен преобразовать данный цвет RGB в формат CMYK, а в случае белого (0,0,0) я должен получить (0,0,0,1). Я пробовал всю ночь, но каждый раз, когда он падает, может понравиться кому-то сказать, что случилось?RGB to CMYK в Haskell

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 '|'

+0

RGB (0,0,0) - черный, а не белый. CMYK (0,0,0,1) также черный (K черный). Не то, чтобы это стало причиной проблемы. – andro

ответ

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 ... 

сидит в качестве плавучего определения в исходном файле.

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) = ??? 
Смежные вопросы