Согласно нескольким источникам, реализация Haskell для компоновки функторов более или менее следующая:
import Data.Functor.Compose
newtype Compose f g a = Compose { getCompose :: f (g a) }
instance (Functor f, Functor g) => Functor (Compose f g) where
fmap f (Compose x) = Compose (fmap (fmap f) x)
Мой вопрос: Каков тип x в последнем определении?
Я бы сказал, что это f g a
, но даже там я изо всех сил стараюсь "видеть" вычисление fmap (fmap f) x
Может ли кто-нибудь быть таким добрым, чтобы обеспечить четкий и полный рабочий пример этого момента? Как насчет fmapping a Tree
of Maybe
, обращая внимание на Empty
и Node
's?
Спасибо заранее.