Почему это определение функтора дает мне ошибку? - PullRequest
0 голосов
/ 14 мая 2018
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?

1 Ответ

0 голосов
/ 14 мая 2018

Должно работать, если вы уберете f перед PPImage и добавите map или fmap к f p. p - это список, поэтому вы не можете применить f напрямую, его также нужно fmap указывать на содержимое p.

instance Functor PPMImage where
    fmap f (PPMImage w h m c p) = PPMImage w h m c (fmap f p)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...