我有一个类型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)
。然而,天真的方法失败了,因为 Image 类型不能包含除浮点数以外的东西,因此无法实现fmap
。
这怎么可能实现?