 <p>The useful difference between </p> <pre><code>data Point = Point Float Float data Radius = Radius Float data Shape = Circle Point Radius </code></pre> <p>and<br> <code>data LengthQty = Radius Float | Length Float | Width Float</code></p> <p>is the way Haskell's type system handles them. Haskell has a powerful type system, which makes sure that a function is passed data that it can handle. The reason you'd write a definition like <code>LengthQuantity</code> is if you had a function which could take either a <code>Radius</code>, <code>Length</code>, or <code>Width</code>, which your function can't do. </p> <p>If you <em>did</em> have a function which could take a <code>Radius</code>, <code>Length</code>, or <code>Width</code>, I'd write your types like this: </p> <pre><code>data Point = Point Float Float data Radius = Radius Float data Shape = Circle Point Radius data LengthQty = R Radius | L Length | W Width </code></pre> <p>This way, functions that can only take a <code>Radius</code> benefit from that more specific type checking.</p>