title: does this GADT actually have type role representational
body: <p>This data type can have <code>type role HCons' representational representational</code>, which allows using <code>coerce</code> to add or remove newtypes applied to the elements, without needing to traverse the list.</p>
  
  <pre><code>data HNil' = HNil'
  data HCons' a b = HCons' a b
  </code></pre>
  
  <p>However the syntax for those lists is not as nice as those with the following GADT </p>
  
  <pre><code>data HList (l::[*]) where
      HNil  :: HList '[]
      HCons :: e -&gt; HList l -&gt; HList (e ': l)
  </code></pre>
  
  <p>I have a class to <a href="http://hackage.haskell.org/package/HList-0.3.4.1/docs/Data-HList-HList.html#t%3aConvHList">convert between these two representations</a>, such that <code>Prime (HList [a,b]) ~ HCons' a (HCons' b HNil')</code>. Does that class make</p>
  
  <pre><code>coerceHList :: Coercible (Prime a) (Prime b) =&gt; HList a -&gt; HList b
  coerceHList = unsafeCoerce
  </code></pre>
  
  <p>safe?</p>