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