title: Does haskell hide types if the same name is used in a different module?
body: <p><strong>EDIT</strong></p>
  
  <p>All thee answers did explain it well enough, just one final thing, can anyone point me to the documentation about the types, so I can understand how the types are handled internally</p>
  
  <p>I am trying to implement a wrapper type for IO, to understand types. I have created a IO' type which is actually using the IO to construct.</p>
  
  <pre><code>data IO' a = IO a
  
  test :: String -&gt; IO' String
  test x = IO x 
  
  convert :: IO' String -&gt; String
  convert (IO x) =  x
  
  main = do
          a &lt;- getLine
          return $ convert.test $ a
  </code></pre>
  
  <p>However now if I try to use IO to return an IO action then it fails, example the following function fails giving the expected vs actual type error:</p>
  
  <pre><code>fail :: IO String
  fail = IO "test"
  </code></pre>
  
  <p>So in Haskell are types using same names get hidden? Also how do I understand whether I am using data constructor or type constructor when I call IO.</p>
  
  <p>Finally, seems like a silly question but I tried to find the documentation for System.IO and later for List type as well, and am not able to find it.</p>