У меня есть тип Image
, который в основном представляет собой c-массив поплавков. Легко создавать функции
таких как map :: (Float -> Float) -> Image -> Image
или zipWith :: (Float -> Float -> Float) -> Image -> Image -> Image
.
Тем не менее, я чувствую, что также возможно обеспечить что-то, что выглядит как аппликативный экземпляр поверх этих функций, что позволяет использовать более гибкие манипуляции на уровне пикселей, такие как ((+) <$> image1 <*> image2)
или ((\x y z -> (x+y)/z) <$> i1 <*> i2 <*> i3)
. Однако наивный подход терпит неудачу, поскольку тип изображения не может содержать вещи, отличные от плавающих, что делает невозможным реализовать fmap
как таковой.
Как это можно реализовать?