Tengo un tipo Image
que es básicamente una c-matriz de flotadores. Es fácil crear funciones como map :: (Float -> Float) -> Image -> Image
, o zipWith :: (Float -> Float -> Float) -> Image -> Image -> Image
.Aplicativo sin un functor
Sin embargo, tengo la sensación de que también sería posible proporcionar algo que se parece a una instancia aplicativo en la parte superior de estas funciones, lo que permite manipulaciones a nivel de píxel más flexibles como ((+) <$> image1 <*> image2)
o ((\x y z -> (x+y)/z) <$> i1 <*> i2 <*> i3)
. Sin embargo, el enfoque ingenuo falla, ya que el tipo de imagen no puede contener elementos distintos de flotantes, por lo que es imposible implementar fmap
como tal.
¿Cómo podría implementarse esto?
¿Por qué no permites que una imagen contenga otra cosa que flotadores? Claro, su 'display :: Image Float -> IO()' solo podría tomar imágenes con flotadores, pero para otras funciones como 'map' no importaría. –
El tipo de imagen es una matriz c que debe pasarse a funciones c, sin pasar demasiado tiempo haciendo conversiones. Además, supongo, que si pudiera tener funciones como funciones, tener unos pocos millones de funciones parcialmente evaluadas después de llamar a "puro" sería bastante desagradable en cuanto a rendimiento. (Implementar 'pure' al tener una Imagen de funciones también es problemático ya que no puede conocer el tamaño de la imagen.) – aleator
puede definir su tipo como' tipo Image = CArray Float' y crear una instancia de Functor para CArray con fmap siendo su función de mapa, y se asegura de que no se puede hacer un CArray de nada más que flotador de CArray (no exportar el constructor, por ejemplo) –