<p dir="ltr"><br>
On Apr 2, 2014 4:32 PM, "Niklas Haas" <<a href="mailto:haskell@nand.wakku.to">haskell@nand.wakku.to</a>> wrote:<br>
><br>
> On Wed, 2 Apr 2014 09:51:46 -0400, Edward Kmett <<a href="mailto:ekmett@gmail.com">ekmett@gmail.com</a>> wrote:<br>
> > We're not storing the instance as a slot in the constructor, so this isn't.<br>
> ><br>
> > data Foo a where<br>
> >    Foo :: Seq a => Int -> a -> Foo a<br>
> ><br>
> > or equivalently<br>
> ><br>
> > data Foo a = Seq a => Foo !Int !a<br>
><br>
> Why not? Say we define Seq to something like<br>
><br>
> > type family Seq (a :: *) :: Constraint where<br>
> >   Seq (a -> b) = 1 ~ 0<br>
> >   Seq t = ()<br>
><br>
> What would be the drawback in this scenario?</p>
<p dir="ltr">I think that would be acceptable if we posit the existence of a valid Seq a dictionary.  I think that would be possible for all builtin types and anything defined via data.  But what about e.g.</p>
<p dir="ltr">  newtype F = F (forall x. Show x => x-> String)<br></p>