
Simon Marlow wrote:
Hmm, I deliberately didn't suggest using a type class. Do you really want to expose Win32 paths and POSIX paths, and whatever else, as different types? Maybe you do for extensibility, but you really want a single Path type too - otherwise portable code will have to use conditional compilation. The Path type therefore has to be an existential wrapper:
data Path = (CPath p) => Path p
Maybe we do want to do this, but it causes portability issues with the Path library itself: nhc98 can't compile this code for example - you can rewrite it using an explicit record of operations, as long as none of the operations are polymorphic...
Not at all. You just include some nice operation in the class: emptyPath :: Path p => p appendPath :: Path p => p -> String -> p etc... So it is an abstract datatype and class. The user never needs to touch the concrete type, even though they use it... The types remain polymophic. Keean.