Hi, Am Freitag, den 06.09.2013, 15:03 +0000 schrieb Simon Peyton-Jones: > Sounds amazing Joachim -- great work.
Thanks!
> | Consider
> | data Foo a = MkFoo (a,a).
> | The (virtual) instance
> | instance Coercible a b => Coercible (Foo a) (Foo b)
> | can only be used when MkFoo is in scope, as otherwise the user could
> | break abstraction barriers. This is enforced.
>
> Whoa! Where did this instance come from? I thought that we generated
> precisely two (virtual) instances for Foo:
>
> instance Coercible a (b,b) => Coercible a (Foo b)
> instance Coercible (a,b) b => Coercible (Foo a) b
>
> and no others. That it. Done. That was precisely the payload of my message
> of 2 August, attached.
Well, that is the case when we want to unwrap a newtype. But this is not
the case here: We have a data type and we want to cast one of its type
arguments. Clearly, we want to have
instance Coercible a b => Coercible [a] [b]
right? The instance above is just an other instance (heh) of that form.
The two virtual instances that you mention only make sense for newtype,
_in addition_ to the usual “cast something inside this type”.
> [..]
>
> In short, I think that if you use the approach I outlined, all these problems
> go away. Am I wrong?
I believe so; I hope I just clarified it.
Greetings,
Joachim
--
Joachim “nomeata” Breitner
[email protected] • http://www.joachim-breitner.de/
Jabber: [email protected] • GPG-Key: 0x4743206C
Debian Developer: [email protected]
signature.asc
Description: This is a digitally signed message part
_______________________________________________ ghc-devs mailing list [email protected] http://www.haskell.org/mailman/listinfo/ghc-devs
