Я просматриваю статью (http://comonad.com/reader/2012/abstracting-with-applicatives/) и нашел следующий фрагмент кода:
newtype Compose f g a = Compose (f (g a)) deriving Show
instance (Functor f, Functor g) => Functor (Compose f g) where
fmap f (Compose x) = Compose $ (fmap . fmap) f x
Как на самом деле (fmap . fmap)
typechecks?
Их типы:
(.) :: (a -> b) -> (r -> a) -> (r -> b)
fmap :: (a -> b) -> f a -> f b
fmap :: (a -> b) -> f a -> f b
Теперь отсюда я не вижу никакого способа, в котором fmap . fmap
будет typecheck?