
On 12/11/2010, at 2:17 AM, Michael Snoyman wrote:
So why would you ever need to reuse the same field name in the same module?
data PetOwner data FurnitureOwner
data Cat = Cat { owner :: PetOwner } data Chair = Chair { owner :: FurnitureOwner }
Just the first thing that came to mind, this kind of thing comes up often enough to be an irritant. I'm not sure whether or not TDNR is a good solution to the problem, just pointing out a use case.
I'm afraid it's not a *convincing* use case. It's not convincing because here "owner" *means different things*. The genius of typeclasses was that it gave us a way to implement functions differently for different types while still referring all the implementations to a single interface, so that they should all in _some_ sense mean the same thing. If x owns a pet, then x is responsible for providing it with food, water, shelter, and medical treatment, and can be gaoled for failing to do so. If y owns a chair, then y can sit on it, spray it with mayonnaise, smash it to pieces, burn it to ashes, or do pretty much anything y pleases. There is no duty to provide a pet chair with food, water, &c. There was a German case a couple of years ago where a man described a fantasy of his on the internet and asked for a volunteer to help him carry it out in reality. He got one. The other man came to his flat, they had sex, and then the first man killed the other and ate him. My take on this was that there were things you *can't* consent to. The colleague I discussed it with a couple of days ago said "If I don't own my body, I own nothing" and said that owning your own body had to mean having the right to volunteer to killed and eaten. He's such a nice man, my colleague, and deeply skilled in logic. Thinking about this, I came to the conclusion that when he and I say "my body" we mean different things. I mean INalienable possession, he means alienable possession. It's like the difference between a dog's meat (food for the dog from another animal, take it away and the dog is hungry) and a dog's flesh (the dog's own matter, take it away and there is no dog). There's that rather silly piece in Plato's Republic where he says "Both the community of property and the community of families ... tend to make them more truly guardians; they will not tear the city in pieces by differing about "mine" and "not mine"; ... but all will be affected as far as may be by the same pleasures and pains ..." Since when can my hunger be the same as your hunger? Since when can my bladder discomfort (I've been sitting at this keyboard too long) be the same as yours? Since when can your pleasure in eating onions be the same as mine (I _hate_ onions, and even if I didn't, I wouldn't want to eat the _same_ bits of onion you're eating). Greek didn't distinguish between alienable and inalienable possession. If that kind of ambiguity can lead the most famous philospher in history to write twaddle, what is confusion in our function names going to do to Haskell programmers? TDNR has the same attractiveness as a sugar coated laxative tablet, and I expect the end product of both to be the same.