Oh bother, I forgot to add that you can of course insert a new value with an old key (suitably typed) and have it overwrite. Else, as you say, there would not be much point.
Maybe it'd be better to have a separate key-construction function newKey :: k -> Key k a instead of having insert return a key. S | -----Original Message----- | From: Ralf Hinze [mailto:[EMAIL PROTECTED] | Sent: 06 June 2003 14:12 | To: Simon Peyton-Jones; Tim Sweeney; [EMAIL PROTECTED]; Ashley Yakeley | Subject: Re: Typesafe MRef with a regular monad | | > A more concrete way to formulate a problem that I believe to be | > equivalent is this. Implement the following interface | > | > module TypedFM where | > data FM k -- Abstract; finite map indexed by keys | > of type k | > data Key k a -- Abstract; a key of type k, indexing a | > value of type a | > | > empty :: FM k | > insert :: Ord k => FM k -> k -> a -> (FM k, Key k a) | > lookup :: Ord k => FM k -> Key k a -> Maybe a | > | > The point is that the keys are typed, like Refs are. But the finite map | > FM is only parameterised on k, not a, so it can contain (key,value) | > pairs of many different types. | > | > I don't think this can be implemented in Haskell, even with | > existentials. But the interface above is completely well typed, and can | > be used to implement lots of things. What I *don't* like about it is | > that it embodies the finite-map implementation, and there are too many | > different kinds of finite maps. | | Here is a Haskell 98 implementation: | | > module TypedFM | > where | | > data FM k = FM | > data Key k a = Key k a | | > empty = FM | > insert FM k a = (FM, Key k a) | > lookup FM (Key k a) = Just a | | Cheers, Ralf | _______________________________________________ Haskell mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell