ShowS is just a type alias for String -> String. Anywhere where you could put a function of type String -> String you could replace that with ShowS. Examples
blah :: String -> String
blah "abc" = "def"
is no different than
blah :: Shows
blah "abc" = "def"
From the GHC.Show import
GHC.Show.showList__ :: (a -> ShowS) -> [a] -> ShowS
is equivalent to
GHC.Show.showList__ :: (a -> (String -> String)) -> [a] -> (String -> String)
It can be a little confusing but a lot of times you use the same function prototype and it is useful to just turn it into its own little type to shorten the types in your code.