I think it would be ok to expect the
constructors to be visible, even though it might need to a lot
being needed.
BTW I think you might need S1 visible as well otherwise how would
you convert (S1 True :: S Bool Int) into (S1 True :: S Bool Age)?
If you don't derive the role from constructor visibility then I
think it should fail-safe and default to the nominal role - valid
Haskell 2010 code shouldn't be exposed to an abstraction leak just
because it's GHC compiling it.
On 08/10/2013 14:23, Richard Eisenberg wrote:
Pedro is suggesting a way for a Haskell type-level program to
gain access to role information. This might indeed be useful,
but it doesn't seem terribly related to the problem of defaults
/ abstraction. The problem has to do with definitions like
these:
> module A where
> data S a b = S1 a | S2 b
> data T a b = MkT (S a b)
> module B where
> import A ( {- what goes here? -} )
>
> class C a where
> mkT :: T Bool a
>
> instance C Int where ...
> newtype Age = MkAge Int deriving C
What constructors do we need in order to convert the (C Int)
instance to (C Age) by hand? To me, it looks like we need MkT
and S2, but not S1. Yet, this is not obvious and seems to be
quite confusing.
I hope this helps understanding the issue!
Richard