On 12/06/2004, at 9:52 AM, [EMAIL PROTECTED] wrote:
Hi, when writing haskell code. It is so annoying that name clashes keep happening.
I have to be careful about the data constructor names, about the class names, about the class member names.
I understand that we can use class to achieve some overloading effect.
However, it does not help with data constructors. And, what's more
important, it looks like Haskell does not allow two classes sharing methods
of the same name.
The standard response to this is "use the module system to help you". Don't export your data constructors because you then expose the internals of your module, which is bad for abstraction; export function names which serve as the data constructors instead.
Use qualified module names. e.g. in the case of the Data.FiniteMap module, it has function names such as "emptyFM", "unitFM", "addToFM", etc. Don't do this, instead call those functions "empty", "unit", "add", and then a user of a module can use the module by using qualified module names:
module MyModule where
import Data.FiniteMap as FM
foo = FM.add key elt FM.empty
You can 'wrap' the current Data.FiniteMap module with your own MyFiniteMap module to achieve this affect.
I think this is a far from ideal solution, but it's adequate. Google for "per-type function namespaces", which was an idea I sent to the list a few months ago, for something which I think better solves the naming issue. Quite a lot of people disagreed with it, but I still think it's a good idea. (FWIW, I nearly managed to implement this with Template Haskell, but I couldn't work around the restriction that you couldn't splice in a TH function declared in the same module.)
-- % Andre Pang : trust.in.love.to.save
_______________________________________________ Haskell mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell
