Насколько я понимаю, у вас есть список пикселей, и вы хотите изменить первый компонент (то есть красный компонент) каждого пикселя.Следовательно, вам нужна следующая функция:
changeAllPixels :: [Pixel Int] -> [Pixel Int]
Q: Как мы можем изменить каждый элемент списка? A: Мы используем map
:
changeAllPixels = map changeOnePixel
changeOnePixel :: Pixel Int -> Pixel Int
Мы хотим изменить только красный компонент.Следовательно, у нас есть:
changeOnePixel = changeRedComponent doSomething
changeRedComponent :: (a -> a) -> Pixel a -> Pixel a
changeRedComponent f (Pixel (r, g, b)) = Pixel (f r, g, b)
doSomething :: Int -> Int
Теперь вам нужно только реализовать doSomething
.Например, если вы хотите инвертировать красный компонент, вы можете реализовать doSomething
следующим образом:
doSomething x = 255 - x
Обратите внимание, что мы не сделали Pixel
экземпляром Functor
.Это потому, что мы хотим изменить только красный компонент и оставить зеленый и синий компоненты в покое.Однако мы использовали map
, то есть fmap
для списков.
Я думаю, что самая большая проблема у вас заключается в том, что вы плохо понимаете функторы.Возможно, вам стоит потратить некоторое время на знакомство с ними.