
On Fri, 2008-09-26 at 21:51 +0100, Simon Marlow wrote:
You will argue that they have control over what they import, and can thereby control whether they export the instance. This is certainly true, but it ignores the need for module abstraction: the need to be able to change the implementation of a module without changing its API. We must have the property that the imports of a module do not affect its API - and the only way to have this property is to avoid orphan instances in library APIs.
(hmm, I finally feel like I've explained this clearly. I hope it comes across that way.)
Yes, I think that's a clear explanation and one I think is quite convincing.
There are basically only two sensible choices for the Functor instance for (->):
(a) don't define one at all (b) define one in Control.Monad, and give up on Haskell 98 compliance
The current situation, namely
(c) define it as an orphan, and give up on module abstraction
is not a sensible choice.
Right. No orphan instances in libraries. Duncan