You are using this instance:
instance Monoid b => Monoid (a -> b) where
mempty _ = mempty
mappend f g x = f x `mappend` g x
which is more general because it does not require endomorphisms (i.e. a -> a). To get the instance you expected, you can wrap your functions in Endo:
appEndo (mconcat [Endo id, Endo id, Endo id, Endo id])
or
appEndo $ mconcat $ fmap Endo [id, id, id, id]
source
share