
On Fri, Mar 28, 2014 at 3:56 PM, Richard Eisenberg
- Edward and Mark have said that with a default of a nominal role "Nothing easy could just be easy." Yet, we accept the need for deriving Eq and Show without question. I think, if we ignore its current alienness, a role annotation is on a similar order -- a role annotation (in a world with a nominal default) would be granting new capabilities to users of a type, just like adding instances of classes.
Well, "deriving (Eq, Show)" is a bit less wordy than "type role Foo representational representational". Although I guess you could just do "type role Foo _ _ _". On the other hand, telling people to add "type role Map nominal _" where it matters is analogous to telling them to have an explicit export list when they want to hide a type's constructors.
- If you could use GND only where the constructors are available, then some valid current use of GND would break, I believe. It would mean that GND would be unable to coerce a (Map String Int) to a (Map String Age), because the constructor of Set is (rightly) not exported. This would have a direct runtime significance for some users -- their code would run slower.
One might attempt a compromise:
- types with explicit annotations always have the specified roles
- types with no explicit annotations but visible constructors have the
inferred roles
- types with no explicit annotations and no visible constructors have
nominal roles
--
Dave Menendez