Constraints on data-types, mis-feature?

Hello In the archives of haskell-cafe I found a mention of constraints on datatypes as a mis-feature of Haskell. In particular, that they're not propagated well. Can someone elaborate on that? Also, are they still considered a mis-feature with the emergence of GADTs ? If I have data GADT a where ... Alt :: (a -> b -> c) -> GADT a -> GADT b -> GADT c ... and I want to constrain all a, b, c. Would it be better to expose all of them as type vars, rather than constrain in-place? It would lead to a rather verbose code.

On Monday 09 July 2007, Daniil Elovkov wrote:
Hello
In the archives of haskell-cafe I found a mention of constraints on datatypes as a mis-feature of Haskell. In particular, that they're not propagated well. Can someone elaborate on that?
Also, are they still considered a mis-feature with the emergence of GADTs ?
If I have
data GADT a where ... Alt :: (a -> b -> c) -> GADT a -> GADT b -> GADT c ...
and I want to constrain all a, b, c.
Would it be better to expose all of them as type vars, rather than constrain in-place? It would lead to a rather verbose code.
GADTs don't change anything (at least, not the last time I checked). If you say class C a where ... data GADT a where ... Alt :: (C a, C b, C c) => (a -> b -> c) -> GADT a -> GADT b -> GADT c ... when you pattern match on Alt, the compiler finds the instances for C a and C b, but the constraint C c is ignored. So constraints on data types work exactly the same way they always have, and the standard arguments against them all still work. (Although now I think the status of this `feature' can be down-graded to wart: after all, if you say newtype Id a = Id a data GADT a where ... Alt :: (C a, C b, C c) => (a -> b -> c) -> GADT (Id a) -> GADT (Id b) -> GADT (Id c) ... pattern-matching on Alt introduces all three constraints into the current context. . .) Jonathan Cast http://sourceforge.net/projects/fid-core http://sourceforge.net/projects/fid-emacs

On 7/9/07, Jonathan Cast
GADTs don't change anything (at least, not the last time I checked).
GHC (in HEAD, at least) eliminates this wart for any datatype declared with GADT syntax. http://www.haskell.org/ghc/dist/current/docs/users_guide/data-type-extension... "Any data type that can be declared in standard Haskell-98 syntax can also be declared using GADT-style syntax. The choice is largely stylistic, but GADT-style declarations differ in one important respect: they treat class constraints on the data constructors differently. Specifically, if the constructor is given a type-class context, that context is made available by pattern matching." Jim

On Tuesday 10 July 2007, Jim Apple wrote:
On 7/9/07, Jonathan Cast
wrote: GADTs don't change anything (at least, not the last time I checked).
GHC (in HEAD, at least) eliminates this wart for any datatype declared with GADT syntax.
http://www.haskell.org/ghc/dist/current/docs/users_guide/data-type-extensio ns.html#gadt-style
"Any data type that can be declared in standard Haskell-98 syntax can also be declared using GADT-style syntax. The choice is largely stylistic, but GADT-style declarations differ in one important respect: they treat class constraints on the data constructors differently. Specifically, if the constructor is given a type-class context, that context is made available by pattern matching."
I'll definitely check this out; I've been quite annoyed by this restriction in the past. Jonathan Cast http://sourceforge.net/projects/fid-core http://sourceforge.net/projects/fid-emacs

On Tuesday 10 July 2007, Jim Apple wrote:
On 7/9/07, Jonathan Cast
wrote: GADTs don't change anything (at least, not the last time I checked).
GHC (in HEAD, at least) eliminates this wart for any datatype declared with GADT syntax.
http://www.haskell.org/ghc/dist/current/docs/users_guide/data-type-extensio ns.html#gadt-style
"Any data type that can be declared in standard Haskell-98 syntax can also be declared using GADT-style syntax. The choice is largely stylistic, but GADT-style declarations differ in one important respect: they treat class constraints on the data constructors differently. Specifically, if the constructor is given a type-class context, that context is made available by pattern matching."
Cool! Looks like it does work in HEAD (although it does /not/ in 6.6.1). Jonathan Cast http://sourceforge.net/projects/fid-core http://sourceforge.net/projects/fid-emacs
participants (3)
-
Daniil Elovkov
-
Jim Apple
-
Jonathan Cast