On Tuesday 16 April 2002 07:15 pm, Jorge Adriano wrote: > [1] Bug1? > > This declaration: > > A = (,) Int Int > > is accepted by ghci. Is this behaveour correct, > 1. It kind of shadows (,) is defined in PrelTup meaning that you can no > longer use (,) prefix to refer to tuples - like (,) 1 2. > 2. Seems to me like (,) is not correct syntax for a consym as defined in > the H98 Report so we shouldn't be able to redefine it. > ...
I found that ghci (I'm using version 5.02.2) will also allow you to reuse [] as a constructor, as in: > data Foo a = [] a deriving Show For some reason, though, this has the side effect of causing a segmentation fault whenever I type in a literal list like [1,2,3]. Here are some other weird things you can try: > data [] a = [] Int deriving Show --ghci complains about duplicate instances > data [] = [] Int deriving Show Test> [] 6543 [] 6543 Test> :i [] -- PrelBase.[] is a data constructor PrelBase.[] :: Int*** Exception: Prelude.head: empty list >data (,) a b = (,) b a Test> ('a',72::Int) ('a',72) Test> (,) 'a' (72::Int) (97,'H') >data (,) a b = (,) b a >typecast :: a -> b >typecast x = fst ((,) x undefined) Evidently, when you redefine the datatypes [] or (,), you can change the internal representation of those types, without affecting their class instances or other functions that may have depended on the original representation. Obviously this does not preserve type safety. I see two possible remedies: (1) Simply disallow [] and (,) as user-defined types, or (2) Allow users to define their own versions of [] and (,), but use qualified names to distinguish them from the originals. - Brian Huffman _______________________________________________ Haskell mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell