В Программирование на Haskell из первых принципов раздел 16.13, тип данных Wrap представлен для демонстрации типа, экземпляр Functor которого требует ограничения класса типов для одного из его параметров:
data Wrap f a =
Wrap (f a)
deriving (Eq, Show)
После демонстрации нескольких неправильных экземпляров Functor для (Wrap f) отображается правильный экземпляр:
instance Functor f => Functor (Wrap f) where
fmap g (Wrap fa) = Wrap (fmap g fa)
То, что этот экземпляр класса типов должен работать, мне кажется правильным. Действительно, GHC принимает это без жалоб.
Чтобы убедить себя в том, что требуется ограничение 'Functor f', я попытался создать свой собственный экземпляр класса типов без него. Мой подход фокусируется на сопоставлении с образцом, чтобы использовать f в "functor-ish" без fmap, подобно подходам, показанным ранее в книге. Вот попытка:
instance Functor (Wrap f) where
fmap g (Wrap (f a)) = Wrap f (g a)
Когда я загружаю это в GHCi, я получаю следующую ошибку:
Prelude> :l 16.12-wrap.hs
[1 of 1] Compiling Main ( 16.12-wrap.hs, interpreted )
16.12-wrap.hs:10:17: error: Parse error in pattern: f
|
10 | fmap g (Wrap (f a)) = Wrap f (g a)
| ^^^
Failed, no modules loaded.
Может кто-нибудь объяснить проблему с моим покушением? Мне кажется, что GHC имеет достаточно информации, чтобы сделать вывод, что f имеет вид (* -> *) из определения Wrap сверху, поэтому я не могу понять, почему моя попытка не анализируется.