Justin Johansson wrote:
Andrei Alexandrescu Wrote:

Hello,


Today, overriding functions have covariant return types:

class A {
     A clone();
}

class B : A {
     B clone(); // fine, overrides A.clone
}

That is entirely principled and cool. Now the entire story is that overriding function may have not only covariant return types, but also contravariant argument types:

class A {
     A fun(B);
}

class B : A {
     B fun(A); // fine (in theory), overrides A.fun
}

Today D does not support contravariant arguments, but Walter told me once he'd be quite willing to implement them. It is definitely the right thing to do, but Walter would want to see a compelling example before getting to work.

Is there interest in contravariant argument types? If so, do you know of a killer example?


Thanks,

Andrei

Yes please.  Gimme, gimme, gimme.  Andrei and Walter,  you guys are legends.

Currently I'm developing a specialized collection library based on templated 
quantified types.  Such library is useful in pattern matching applications.

Now despite any (negative) comments I may have made on prior occasion regarding 
Scala being too academic re covariance & contravariance, it is difficult 
producing this type of library without language support for covariant and 
contravariant typing.

Designing such support into D would bring even more credibility to the language 
.. especially if you guys can come up with a neat syntax to effect this 
feature.  I'm impressed with the way Walter observed that the ! operator was 
not a binary operator in C/C++ and then went about re-purposing it for template 
syntax.  Accordingly I wouldn't be surprised if you guys pulled another cool 
rabbit-out-of-the-hat trick.

So yes there is extreme interest in my neck of the woods but as for a killer 
example, I need to think this out in more time than this reply makes for at the 
moment.

If you do this, I suspect that it will be the end of my D1 adventures and force 
me into D2.

Cheers
Justin Johansson

Thanks. To paraphrase Mark Twain, the reports of Walter and I being legend are greatly exaggerated.

Syntactically there is no need to change anything, just carry the change in the implementation.


Andrei

Reply via email to