
On 2016-02-25 at 10:21:20 +0100, Daniel Trstenjak wrote:
What was the design decision behind orphans? Why were they considered a good idea?
In Haskell 1.2 there was a so-called "C-T Rule" which was relaxed for Haskell 1.3 [1]: | C-T Rule relaxation | | The C-T rule restricts the placement of instance declarations to the | module containing either the class or data type definition associated | with an instance. This is unnecessarily restrictive and will be relaxed | in Haskell 1.3. The new restriction will be that no more than one | instance for a given class - datatype pair is allowed in a | program. (Sadly, there's little hope of detecting violations of this | rule before link time.) | | The visibility of instance declarations presents a problem. Unlike | classes or types, instances cannot be mentioned explicitly in export | lists. Instead of changing the syntax of the export list, we have | adopted a simple rule: all instances are exported regardless of the | export list. All imports bring in the full set of instances from the | imported module. An instance is in scope when a chainof import | statements leads to the module defining the instance. With some luck you may be able to find the discussions leading up to that decision in old email archives. Maybe relevant to this discussion: the rejected paper "Controlling the scope of instances in Haskell" submitted for the 2011 Haskell Symposium together with the rejecting referee reports[2] [1]: https://www.haskell.org/definition/from12to13.html [2]: https://mail.haskell.org/pipermail/ghc-devs/2014-October/006876.html