我倾向于将给定的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 '|'
答案 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 ...
作为源文件中的浮动定义。