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
?