You are almost there. What is the type fmap putStrLn?
putStrLn :: String -> IO ()
fmap :: Functor f => (a -> b) -> f a -> f b
fmap putStrLn :: Functor f => f String -> f (IO ())
And the result fmap putStrLn getLinewill be IO (IO ()), that is, an IO action that contains another IO action. There is no need for warning * in the end, it may be what you intended. The compiler cannot determine if you want m (m a)or m a.
Actually the power of the monad, it has an operation that allows you to join these actions:
join :: Monad m => m (m a) -> m a
-- join x = x >>= id
*, , , . GHC, , -fwarn-missing-signatures. . .