<div dir="ltr"><div class="markdown-here-wrapper" style=""><p style="margin:0px 0px 1.2em!important">Dear all,</p>
<p style="margin:0px 0px 1.2em!important">It is time to review the local modules proposal, from our own Richard Eisenberg, again. In fact it’s been time for a while, and I must apologise to Richard for not having understood that. Sorry, Richard.</p>
<p style="margin:0px 0px 1.2em!important">Link: <a href="https://github.com/ghc-proposals/ghc-proposals/pull/283">https://github.com/ghc-proposals/ghc-proposals/pull/283</a></p>
<p style="margin:0px 0px 1.2em!important">Since the last time, the proposal has been both simplified and made more precise. The main issues solved by this proposal are</p>
<ul style="margin:1.2em 0px;padding-left:2em">
<li style="margin:0.5em 0px">The ability to export qualified names from modules</li>
<li style="margin:0.5em 0px">The ability to define functions with qualified names within a module (<em>e.g.</em> you could have both <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">T.f</code> and <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">U.f</code>).</li>
<li style="margin:0.5em 0px">The ability to locally refer to qualified data as unqualified (suppose <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Set.map</code> is in scope, then the proposal lets you write <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">let import module Set in map f (map g some_set)</code>.</li>
</ul>
<p style="margin:0px 0px 1.2em!important">I think these are three important issues, and the proposal makes a good case that they ought to be solved together. I also think that the specification is clear and doesn’t leave any dark corner. Caveat: I have contributed to writing the current specification, so I may be missing some flaws.</p>
<p style="margin:0px 0px 1.2em!important">The proposal does introduce a somewhat byzantine semantic difference between <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">module X</code> and <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">module qualified X</code> in export lists. This is to keep the current meaning of <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">module X</code> which is already not very intuitive (cf <a href="https://ro-che.info/articles/2012-12-25-haskell-module-system-p1">https://ro-che.info/articles/2012-12-25-haskell-module-system-p1</a> ). I think this is unavoidable.</p>
<p style="margin:0px 0px 1.2em!important">There are also 3 optional pieces of specification that we are asked to rule on (§4). I’m personally in favour of option 1. I’m weakly in favour of option 3 (with a preference for the variant described in Alternative 7). On the other hand option 2 seems to add a bit too much syntactic subtlety to be worth it (though if we choose option 2, I see no reason not to accept Alternative 3 as well).</p>
<p style="margin:0px 0px 1.2em!important">/Arnaud</p>
<div title="MDH:PGRpdj5EZWFyIGFsbCw8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2Pkl0IGlzIHRpbWUgdG8gcmV2
aWV3IHRoZSBsb2NhbCBtb2R1bGVzIHByb3Bvc2FsLCBmcm9tIG91ciBvd24gUmljaGFyZCBFaXNl
bmJlcmcsIGFnYWluLiBJbiBmYWN0IGl0J3MgYmVlbiB0aW1lIGZvciBhIHdoaWxlLCBhbmQgSSBt
dXN0IGFwb2xvZ2lzZSB0byBSaWNoYXJkIGZvciBub3QgaGF2aW5nIHVuZGVyc3Rvb2QgdGhhdC4g
U29ycnksIFJpY2hhcmQuPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5MaW5rOiA8YSBocmVmPSJo
dHRwczovL2dpdGh1Yi5jb20vZ2hjLXByb3Bvc2Fscy9naGMtcHJvcG9zYWxzL3B1bGwvMjgzIiB0
YXJnZXQ9Il9ibGFuayI+aHR0cHM6Ly9naXRodWIuY29tL2doYy08d2JyPnByb3Bvc2Fscy9naGMt
cHJvcG9zYWxzL3B1bGwvPHdicj4yODM8L2E+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5TaW5j
ZSB0aGUgbGFzdCB0aW1lLCB0aGUgcHJvcG9zYWwgaGFzIGJlZW4gYm90aCBzaW1wbGlmaWVkIGFu
ZCBtYWRlIG1vcmUgcHJlY2lzZS4gVGhlIG1haW4gaXNzdWVzIHNvbHZlZCBieSB0aGlzIHByb3Bv
c2FsIGFyZTwvZGl2PjxkaXY+LSBUaGUgYWJpbGl0eSB0byBleHBvcnQgcXVhbGlmaWVkIG5hbWVz
IGZyb20gbW9kdWxlczwvZGl2PjxkaXY+LSBUaGUgYWJpbGl0eSB0byBkZWZpbmUgZnVuY3Rpb25z
IHdpdGggcXVhbGlmaWVkIG5hbWVzIHdpdGhpbiBhIG1vZHVsZSAoX2UuZy5fIHlvdSBjb3VsZCBo
YXZlIGJvdGggYFQuZmAgYW5kIGBVLmZgKS48L2Rpdj48ZGl2Pi0gVGhlIGFiaWxpdHkgdG8gbG9j
YWxseSByZWZlciB0byBxdWFsaWZpZWQgZGF0YSBhcyB1bnF1YWxpZmllZCAoc3VwcG9zZSBgU2V0
Lm1hcGAgaXMgaW4gc2NvcGUsIHRoZW4gdGhlIHByb3Bvc2FsIGxldHMgeW91IHdyaXRlIGBsZXQg
aW1wb3J0IG1vZHVsZSBTZXQgaW4gbWFwIGYgKG1hcCBnIHNvbWVfc2V0KWAuPC9kaXY+PGRpdj48
YnI+PC9kaXY+PGRpdj5JIHRoaW5rIHRoZXNlIGFyZSB0aHJlZSBpbXBvcnRhbnQgaXNzdWVzLCBh
bmQgdGhlIHByb3Bvc2FsIG1ha2VzIGEgZ29vZCBjYXNlIHRoYXQgdGhleSBvdWdodCB0byBiZSBz
b2x2ZWQgdG9nZXRoZXIuIEkgYWxzbyB0aGluayB0aGF0IHRoZSBzcGVjaWZpY2F0aW9uIGlzIGNs
ZWFyIGFuZCBkb2Vzbid0IGxlYXZlIGFueSBkYXJrIGNvcm5lci4gQ2F2ZWF0OiBJIGhhdmUgY29u
dHJpYnV0ZWQgdG8gd3JpdGluZyB0aGUgY3VycmVudCBzcGVjaWZpY2F0aW9uLCBzbyBJIG1heSBi
ZSBtaXNzaW5nIHNvbWUgZmxhd3MuPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5UaGUgcHJvcG9z
YWwgZG9lcyBpbnRyb2R1Y2UgYSBzb21ld2hhdCBieXphbnRpbmUgc2VtYW50aWMgZGlmZmVyZW5j
ZSBiZXR3ZWVuIGBtb2R1bGUgWGAgYW5kIGBtb2R1bGUgcXVhbGlmaWVkIFhgIGluIGV4cG9ydCBs
aXN0cy4gVGhpcyBpcyB0byBrZWVwIHRoZSBjdXJyZW50IG1lYW5pbmcgb2YgYG1vZHVsZSBYYCB3
aGljaCBpcyBhbHJlYWR5IG5vdCB2ZXJ5IGludHVpdGl2ZSAoY2YgaHR0cHM6Ly9yby1jaGUuaW5m
by9hcnRpY2xlcy8yMDEyLTEyLTI1LWhhc2tlbGwtbW9kdWxlLXN5c3RlbS1wMSApLiBJIHRoaW5r
IHRoaXMgaXMgdW5hdm9pZGFibGUuPGJyPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+VGhlcmUg
YXJlIGFsc28gMyBvcHRpb25hbCBwaWVjZXMgb2Ygc3BlY2lmaWNhdGlvbiB0aGF0IHdlIGFyZSBh
c2tlZCB0byBydWxlIG9uICjCpzQpLiBJJ20gcGVyc29uYWxseSBpbiBmYXZvdXIgb2Ygb3B0aW9u
IDEuIEknbSB3ZWFrbHkgaW4gZmF2b3VyIG9mIG9wdGlvbiAzICh3aXRoIGEgcHJlZmVyZW5jZSBm
b3IgdGhlIHZhcmlhbnQgZGVzY3JpYmVkIGluIEFsdGVybmF0aXZlIDcpLiBPbiB0aGUgb3RoZXIg
aGFuZCBvcHRpb24gMiBzZWVtcyB0byBhZGQgYSBiaXQgdG9vIG11Y2ggc3ludGFjdGljIHN1YnRs
ZXR5IHRvIGJlIHdvcnRoIGl0ICh0aG91Z2ggaWYgd2UgY2hvb3NlIG9wdGlvbiAyLCBJIHNlZSBu
byByZWFzb24gbm90IHRvIGFjY2VwdCBBbHRlcm5hdGl2ZSAzIGFzIHdlbGwpLjwvZGl2PjxkaXY+
PGJyPjwvZGl2Pi9Bcm5hdWQ8YnI+" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0"></div></div></div>