> >I cannot see how an empty list of tyvars is useful or desirable in > >practice: > > data Foo = Foo (forall . Int) > >is equivalent to just > > data Foo = Foo Int > >so why bother to permit the former? It probably indicates some error in > >the thinking of the programmer, so the compiler should bring it to her > >attention.
The only reasons that I could see in favor of allowing empty "forall"s is that it might be easier to automatically generate code. Haskell seems to be a bit inconsistent in how it treats empty constructs. For example, empty let and empty where seems to be allowed, but not an empty case? > >On the other hand, I can imagine a use for phantom type variables in the > >quantifier (especially if they occur in multi-parameter predicates, but > >not in the type). So I think accepting them with a warning is > >reasonable. > > > >I can also imagine predicates that do not mention locally-quantified > >variables - the assumption must be that they mention variables bound on > >the LHS of the datatype decl instead? e.g. the Show predicate here: > > > > data Foo a b = Foo a b > > | Bar (forall c . (Show b, Relation b c) => (b,c)) > > > >Hmm, maybe a simpler version of this example would illustrate what you > >mean by the proposal (first of the three bullets) to allow an empty > >quantifier list: > > > > data Foo a b = Foo a b > > | Bar (forall . Show b => b) > > > >In which case, does this even count as a polymorphic component at all? > >Is it not rather GADT-like instead? > > > > data Foo a b where > > Foo :: a -> b -> Foo a b > > Bar :: Show b => b -> Foo a b Would these two have the same meaning? I have a feeling what the GADT is, but no idea what the former type means. > >> Constructor that have polymorphic components cannot appear in the > >> program without values for their polymorphic fields. > > > >I didn't fully understand this requirement. If Haskell-prime gets > >rank-2 or rank-n types, then do we need to restrict constructors in this > >way? Ok, this really boils down to the question of whether we do rank-2 or rank-n types. I'm biased, because I actually use rank-n types frequently, and feel somewhat limited by the rank-2 restrictions. I don't know how many people actually do, though. I can understand Iavor's points that rank-2 might be easier to explain, but at least GHC's rank-n extension has a very detailed paper explaining it, so I guess it's one of the better documented extensions. I very much agree that "nested" patterns for polymorphic components should be disallowed. Cheers, Andres _______________________________________________ Haskell-prime mailing list Haskell-prime@haskell.org http://www.haskell.org/mailman/listinfo/haskell-prime