It is not completely backwards compatible, because (for instance) the declaration:

    newtype C a => Foo a = Foo a

was allowed, but:

    newtype Foo a where
      Foo :: C a => a -> Foo a

is an illegal definition. It can only be translated to a non-newtype data declaration, which changes the semantics.


On Thu, Apr 25, 2013 at 10:35 AM, Gábor Lehel <illissius@gmail.com> wrote:
I've wondered this too. What would have been wrong with a simple source-to-source translation, where a constraint on the datatype itself translates to the same constraint on each of its constructors? Perhaps it would be unintuitive that you would have to pattern match before gaining access to the constraint? On a superficial examination it would have been backwards-compatible, allowing strictly more programs than the previous handling.

On Thu, Apr 25, 2013 at 12:38 PM, harry <voldermort@hotmail.com> wrote:
If I understand correctly, the problem with datatype contexts is that if we
have e.g.
  data Eq a => Foo a = Foo a
the constraint Eq a is thrown away after a Foo is constructed, and any
method using Foos must repeat Eq a in its type signature.

Why were these contexts removed from the language, instead of "fixing" them?

PS This is following up on a discussion on haskell-beginners, "How to avoid
repeating a type restriction from a data constructor". I'm interested in
knowing whether there's a good reason not to allow this, or if it's just a
consequence of the way type classes are implemented by compilers.


_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe



--
Your ship was destroyed in a monadic eruption.

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe