At 13:15 2002-01-22 -0500, Hongwei Xi wrote:
<...> In Haskell, I guess that the one implemented later is always chosen. Why can't I have two different implementations for an interface?
Actually, I can't think of situations where I would desire this. Could you please give an example?
Another problem with Haskell classes is that there is currently no way of hiding type information. For instance, suppose that I want to implement a module for operations on sets but I do not want to reveal what data representation I use for sets. Is there a way of doing this in Haskell?
--Hongwei
There is: Use restricted exports. Only export functions on the datatype, and don't export the datatype itself. For example: ----------------------- Module Set ( emptySet , makeSet , firstOfSet ) where -- Not exported, only locally visible data Set a = EmptySet | OneElementSet a -- Using these functions, everyone can -- make, change and read Set's emptySet :: Set a emptySet = EmptySet makeSet :: a -> Set a makeSet x = OneElementSet x firstOfSet :: Set a -> a firstOfSet EmptySet = error "Set.firstOfSet: Empty set" firstOfSet (OneElementSet x) = x ----------------------- Regards, Rijk-Jan van Haaften