
On Dec 21, 2007 2:38 PM, Jules Bean
David Menendez wrote:
That's a reasonable thing to assume. It just happens that Haskell doesn't work that way. There's an asymmetry between constructing and pattern-matching, and it's one that many people have complained about.
With GADTs turned on (-XGADTS in 6.8, -fglasgow-exts in 6.6) pattern matchings will give rise to class contexts as you would naively expect.
Contexts on constructors aren't actualy haskell98, it is a bug that GHC 6.6 accepts them without any extensions being activated. Or that's my understanding, see http://hackage.haskell.org/trac/ghc/ticket/1901
I think I saw [1] and just mentally substituted [2]. In fact, until just now
I didn't know [1] was even possible. (Wasn't there some problem with class
contexts in GADTs?)
[1] data SquareType a = (Num a) => SquareConstructor a
[2] data (Num a) => SquareType a = SquareConstructor a
Okay, so pattern-matching in case [1] does guarantee Num a. In that case,
the original code didn't work because it was trying to unify Int with an
arbitrary instance of Num.
--
Dave Menendez