John Meacham wrote:
[...]
I find trying to draw analogies between haskell classes and constructs in other languages to be problematic as people then try to apply knowledge from other fields incorrectly to haskell unless you give a full explanation of haskell classes anyway.. but YMMV. John
In the particular case of Haskell classes and Java interfaces, I like the analogy *provided that* the Haskell class in question doesn't have a method with two occurrences of the class variable in parameter positions. For example, class Set s where empty :: (a -> a -> Ordering) -> s a insert :: s a -> a -> s a member :: s a -> a -> Bool fits nicely (until you add a union method), but Eq does not. The classes which fit the Java interface analogy are also the classes which can be rendered as explicit dictionaries instead: module Set where data Set a = Set {insert :: a -> Set a, member :: a -> Bool} module RedBlack(empty) where import Set empty :: (a -> a -> Ordering) -> Set a empty cmp = ... Importantly (IMHO), if you use an explicit dictionary instead of a class, the 'heterogeneous list of class instances' problem goes away. Regards, Tom