data PPMImage a = PPMImage {width :: Integer,
height :: Integer,
magicNumber :: Integer,
maxColor :: Integer,
pixels :: [a]} deriving (Show)
instance Functor PPMImage where
fmap f (PPMImage w h m c p) = f PPMImage w h m c (f p)
Мне кажется, я понимаю весь аспект функтора оборачивания и разворачивания - эта ссылка , предоставленная пользователем MCH, очень помогла.
Функции и списки уже являются функторами, но это PPMImage
, которое я определил, не имеет экземпляра функтора по умолчанию. Я пытаюсь определить тот, который будет применяться к массиву (пикселов) PPMImage
, но я получаю эту ошибку:
Couldn't match expected type ‘[b]’ with actual type ‘b’
‘b’ is a rigid type variable bound by
the type signature for:
fmap :: forall a b. (a -> b) -> PPMImage a -> PPMImage b
at New.hs:13:5-8
• In the fifth argument of ‘PPMImage’, namely ‘(f p)’
In the expression: PPMImage w h m c (f p)
In an equation for ‘fmap’:
fmap f (PPMImage w h m c p) = PPMImage w h m c (f p)
• Relevant bindings include
f :: a -> b (bound at New.hs:13:10)
fmap :: (a -> b) -> PPMImage a -> PPMImage b (bound at New.hs:13:5)
Я не понимаю, почему это происходит, разве этот функтор просто не развернет оригинал PPMImage
, затем применит функцию f
, а затем снова свернет в новый PPMImage
?