title: Unnecessary type juggling to define Data.Void (package "void" on Hackage)?
body: <p>The <a href="http://hackage.haskell.org/package/void-0.5.5">void</a> package claims to provide an uninhabitable type called <code>Void</code>, which is defined as follows -</p>
  
  <pre><code>newtype Void = Void Void
  </code></pre>
  
  <p>How is this definition any better than using something simpler? Say -</p>
  
  <pre><code>data Void
  </code></pre>
  
  <p>If my understanding is correct, both the data types contain only bottom values. However the latter is much easier to understand.</p>
  
  <p><strong>EDIT</strong>: Okay so I understand Daniel's answer below. However I thought of another possibly simpler way to do this while remaining Haskell98 compatible. We can use an Abstract data type and expose no constructors to the user.</p>
  
  <pre><code>module Data.Void (Void) where
    data Void = Void
  </code></pre>
  
  <p>Now only code in Data.Void module can construct a Void, however since we know it <em>doesn't</em>, the Void datatype is effectively uninhabited.</p>
  
  <p>Would that work or am I missing something here?</p>