[Haskell-cafe] Re: [Haskell] Re: Global Variables and IO initializers

John Meacham john at repetae.net
Mon Nov 29 18:41:44 EST 2004

On Mon, Nov 29, 2004 at 11:57:31AM +0100, Benjamin Franksen wrote:
> Can anyone think of a situation where adding a derived instance to an 
> abstract data type breaks one of its invariants?

Yes, I was thinking of this the other day, 

newtype LessThan5 = LessThen5 Int 

new x | x < 5 = LessThen5 x
      | otherwise = error "not less than five"

if someone were allowed to do a 

derive (Enum LessThan5)

in another module, then they could break the invarient with toEnum 6 for

For safety, one should only be able to remotely derive if all the
constructors of the type are in scope as well as the type. However, this
is too strong of a constraint for deriving Typeable which does not care
about the constructors. It is not clear
what the correct thing to do is, perhaps have 2 types of derivable
classes, ones which need the constructors and ones which don't? Hmm.. 

I am sort of of the practically motivated opinion that Typable should be
a built-in that everything is automatically an instance of, but I don't
know if that is really the right thing to do or just a convinient hack. 


John Meacham - ⑆repetae.net⑆john⑈ 

More information about the Haskell-Cafe mailing list