title: Is there a polymorphic `toString` function that doesn't add quotes?
body: <p>In most OO languages that I'm familiar with, the <code>toString</code> method of a <code>String</code> is actually just the identity function. But in Haskell <code>show</code> adds double quotes.</p>
  
  <p>So if I write a function something like this</p>
  
  <pre><code>f :: Show a =&gt; [a] -&gt; String
  f = concat . map show
  </code></pre>
  
  <p>it works as expected for numbers</p>
  
  <pre><code>f [0,1,2,3]  -- "0123"
  </code></pre>
  
  <p>but Strings end up with extra quotes</p>
  
  <pre><code>f ["one", "two", "three"] -- "\"one\"\"two\"\"three\""
  </code></pre>
  
  <p>when I really want <code>"onetwothree"</code>.</p>
  
  <p>If I wanted to write <code>f</code> polymorphically, is there a way to do it with only a <code>Show</code> constraint, and without overriding the Show instance for String (if that's even possible). </p>
  
  <p>The best I can come up with is to create my own type class:</p>
  
  <pre><code>class (Show a) =&gt; ToString a where
     toString = show
  </code></pre>
  
  <p>and add an instance for everything?</p>
  
  <pre><code>instance ToString String where toString = id
  instance ToString Char where toString = pure
  instance ToString Int
  instance ToString Maybe
  ...etc
  </code></pre>