[Haskell-cafe] Comments from OCaml Hacker Brian Hurt
Anton van Straaten
anton at appsolutions.com
Thu Jan 15 13:46:40 EST 2009
John Goerzen wrote:
> Though if all we're talking about is naming, I would still maintain that
> newbie-friendly naming is a win. We can always say "HEY MATHEMETICIANS:
> APPENDABLE MEANS MONOID" in the haddock docs ;-)
This is backwards.
The real problem here is that most people coming from other languages
aren't used to working with structures as abstract as monoids, and a
natural first instinct is to try to un-abstract them, in this case via
the suggested renaming. The thought process tends to be something like
"I didn't have this problem in language X, Haskell must be doing
something wrong."
This instinct is not appropriate in the Haskell context. (Although as
others have noted, the documentation doesn't do much to help guide
people through this.)
One of the most mind-bogglingly important features of Haskell is that it
is actually possible to make effective use of structures such as
monoids in real code. In most languages, you wouldn't even try this.
But if you're going to create a zoo of abstract structures like monoids,
with the aim of being able to use them as very general building blocks,
the last thing you should be doing is naming them according to
particular applications they have. This goes against the goal of
abstracting in the first place, and will ultimately be confusing and
misleading. (As I pointed out in another comment, the
misleadingly-named 'mappend' is an example of this.)
If there's an existing name for the exact structure in question, it
makes sense to use that name. If you're unfamiliar with the structure,
then you're going to need to learn a name for it anyway - why not learn
a name by which it is already known in other contexts?
The main counter to the latter question is "I want to give it a new name
in order to connote an intended use," but unless the connotation in
question is as general as the structure being named, this is a mistake.
This issue is not unique to structures from abstract algebra & category
theory. It can arise any time you have a very polymorphic function, for
example. It can often make sense to provide a more specifically named
and typed alias for a very general function, to make its use more
natural and/or constrained in a particular context, e.g.:
specificName :: SpecificType1 -> SpecificType2
specificName = moreGeneralFunction
Similarly, in the case of monoid, we need to be able to do this, at
least conceptually:
Appendable = Monoid
...possibly with some additional constraints. In other words, "HEY
PROGRAMMERS: YOU CAN USE MONOID AS AN APPENDABLE THINGY (AMONG OTHER
THINGS)".
This is perhaps an argument for a class alias mechanism, such as the one
described at: http://repetae.net/recent/out/classalias.html
But in the absence of such a mechanism, we shouldn't succumb to the
temptation to confuse abstractions with their applications.
> Much as I dislike Java's penchant for 200-character names for things,
> I'm not sure Monoid is more descriptive than
> SomeSortOfGenericThingThatYouCanAppendStuffToClassTemplateAbstractInterfaceThingy
> :-)
Usable descriptive names for very abstract structures are just not
possible in general, except by agreeing on names, which can ultimately
come to seem descriptive. For example, there's nothing fundamentally
descriptive about the word "append".
Anton
More information about the Haskell-Cafe
mailing list