<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Jul 26, 2021, at 5:38 PM, Simon Peyton Jones <<a href="mailto:simonpj@microsoft.com" class="">simonpj@microsoft.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="WordSection1" style="page: WordSection1; caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><div style="margin: 0cm 0cm 0cm 36pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">I hope this helps!<o:p class=""></o:p></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><o:p class=""> </o:p></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">Alas it leaves me even more confused.</div></div></div></blockquote><div><br class=""></div><div>Somehow I knew you'd say that.</div><br class=""><blockquote type="cite" class=""><div class=""><div class="WordSection1" style="page: WordSection1; caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><o:p class=""></o:p></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><o:p class=""> </o:p></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">Now there are<span class="Apple-converted-space"> </span><i class="">three</i><span class="Apple-converted-space"> </span>concepts in play<o:p class=""></o:p></div><ul type="disc" style="margin-bottom: 0cm; margin-top: 0cm;" class=""><li class="MsoListParagraph" style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">local module<o:p class=""></o:p></li><li class="MsoListParagraph" style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">top-level module<o:p class=""></o:p></li><li class="MsoListParagraph" style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">compilation unit<o:p class=""></o:p></li></ul><div style="margin: 0cm 0cm 0cm 5.2pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">I think that perhaps top-level module = compilation unit. <span class="Apple-converted-space"> </span></div></div></div></blockquote><div><br class=""></div><div>A compilation unit is a chunk of Haskell code which is considered all at once, producing one .o file. Currently, compilation units are coincident both with files on disk and modules. This proposal allows us to have modules smaller than a compilation unit, but Haskell has a restriction that a compilation unit (= file on disk) contains precisely one module (which may contain others), as well as a restriction about where `import` statements appear.</div><div><br class=""></div><div>This little part, starting with "another way to think about this" is meant to provide intuition, if you're already familiar with compilation units. It is separate from the points above -- and is just meant to guide intuition. (For example, I have not properly defined "compilation unit".) If it does not connect with you, skip. Instead, look at the three differences between top-level modules and local modules a little further up, and see that this distinction is very superficial.</div><div><br class=""></div><div>Richard</div><br class=""><blockquote type="cite" class=""><div class=""><div class="WordSection1" style="page: WordSection1; caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><div style="margin: 0cm 0cm 0cm 5.2pt; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><o:p class=""></o:p></div><div style="margin: 0cm 0cm 0cm 5.2pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">But no, you say “there is really no distinction between top-level modules and local modules, but there is a distinction between a compilation unit and a module”. <o:p class=""></o:p></div><div style="margin: 0cm 0cm 0cm 5.2pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">So you seem to be saying “top-level module = local module”.  But then you say “An<span class="Apple-converted-space"> </span><code style="font-family: "Courier New";" class=""><span style="font-size: 10pt;" class="">import</span></code><span class="Apple-converted-space"> </span>statement can name only a top-level module, not a local module.” suggesting that local modules and top level modules are not the same after all.<o:p class=""></o:p></div><div style="margin: 0cm 0cm 0cm 5.2pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">I’m sorry, but I’m pretty baffled<o:p class=""></o:p></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">Simon<o:p class=""></o:p></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><o:p class=""> </o:p></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><o:p class=""> </o:p></div><div style="border-style: none none none solid; border-left-width: 1.5pt; border-left-color: blue; padding: 0cm 0cm 0cm 4pt;" class=""><div class=""><div style="border-style: solid none none; border-top-width: 1pt; border-top-color: rgb(225, 225, 225); padding: 3pt 0cm 0cm;" class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><b class=""><span lang="EN-US" class="">From:</span></b><span lang="EN-US" class=""><span class="Apple-converted-space"> </span>ghc-steering-committee <<a href="mailto:ghc-steering-committee-bounces@haskell.org" class="">ghc-steering-committee-bounces@haskell.org</a>><span class="Apple-converted-space"> </span><b class="">On Behalf Of<span class="Apple-converted-space"> </span></b>Richard Eisenberg<br class=""><b class="">Sent:</b><span class="Apple-converted-space"> </span>26 July 2021 17:55<br class=""><b class="">To:</b><span class="Apple-converted-space"> </span>Alejandro Serrano Mena <<a href="mailto:trupill@gmail.com" class="">trupill@gmail.com</a>><br class=""><b class="">Cc:</b><span class="Apple-converted-space"> </span>GHC Steering Committee <<a href="mailto:ghc-steering-committee@haskell.org" class="">ghc-steering-committee@haskell.org</a>><br class=""><b class="">Subject:</b><span class="Apple-converted-space"> </span>Re: [ghc-steering-committee] #283: Local modules (again), recommendation: accept<o:p class=""></o:p></span></div></div></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><o:p class=""> </o:p></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">Hi Alejandro,<o:p class=""></o:p></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><o:p class=""> </o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">This distinction between top-level module and local module is pretty superficial. I've added a new bit to the proposal to explain this:<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><o:p class=""> </o:p></div></div><div class=""><blockquote style="margin-top: 5pt; margin-bottom: 5pt;" class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><span style="font-family: Symbol;" class="">·</span>  This proposal describes<span class="Apple-converted-space"> </span><em class=""><span style="font-family: Calibri, sans-serif;" class="">top-level modules</span></em><span class="Apple-converted-space"> </span>as distinct from<span class="Apple-converted-space"> </span><em class=""><span style="font-family: Calibri, sans-serif;" class="">local modules</span></em>, but this distinction has little import. Here is the full set of differences between these concepts:<o:p class=""></o:p></div><ol start="1" type="1" style="margin-bottom: 0cm;" class=""><li class="MsoNormal" style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">The<span class="Apple-converted-space"> </span><code style="font-family: "Courier New";" class=""><span style="font-size: 10pt;" class="">module</span></code><span class="Apple-converted-space"> </span>keyword for a top-level module is the first lexeme in a file; the<span class="Apple-converted-space"> </span><code style="font-family: "Courier New";" class=""><span style="font-size: 10pt;" class="">module</span></code><span class="Apple-converted-space"> </span>keyword for a local module must not be the first lexeme in a file.<o:p class=""></o:p></li><li class="MsoNormal" style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">A top-level module can have<span class="Apple-converted-space"> </span><code style="font-family: "Courier New";" class=""><span style="font-size: 10pt;" class="">import</span></code><span class="Apple-converted-space"> </span>statements; a local module can have only<span class="Apple-converted-space"> </span><code style="font-family: "Courier New";" class=""><span style="font-size: 10pt;" class="">import module</span></code><span class="Apple-converted-space"> </span>statements.<o:p class=""></o:p></li><li class="MsoNormal" style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">An<span class="Apple-converted-space"> </span><code style="font-family: "Courier New";" class=""><span style="font-size: 10pt;" class="">import</span></code><span class="Apple-converted-space"> </span>statement can name only a top-level module, not a local module.<o:p class=""></o:p></li></ol><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">That's it! If you like, you can think of a<span class="Apple-converted-space"> </span><code style="font-family: "Courier New";" class=""><span style="font-size: 10pt;" class="">import X</span></code><span class="Apple-converted-space"> </span>statement as a combination of<span class="Apple-converted-space"> </span><code style="font-family: "Courier New";" class=""><span style="font-size: 10pt;" class="">import qualified X</span></code><span class="Apple-converted-space"> </span>and<span class="Apple-converted-space"> </span><code style="font-family: "Courier New";" class=""><span style="font-size: 10pt;" class="">import module X</span></code><span class="Apple-converted-space"> </span>statement: the first loads the external compilation unit named<span class="Apple-converted-space"> </span><code style="font-family: "Courier New";" class=""><span style="font-size: 10pt;" class="">X</span></code><span class="Apple-converted-space"> </span>(in a file<span class="Apple-converted-space"> </span><code style="font-family: "Courier New";" class=""><span style="font-size: 10pt;" class="">X.hs</span></code>) and brings lots of<span class="Apple-converted-space"> </span><code style="font-family: "Courier New";" class=""><span style="font-size: 10pt;" class="">X.blah</span></code>entities into scope, and the second removes the<span class="Apple-converted-space"> </span><code style="font-family: "Courier New";" class=""><span style="font-size: 10pt;" class="">X.</span></code><span class="Apple-converted-space"> </span>qualification.<o:p class=""></o:p></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">Another way to think about this is that there is really no distinction between top-level modules and local modules, but there is a distinction between a compilation unit and a module. An<span class="Apple-converted-space"> </span><code style="font-family: "Courier New";" class=""><span style="font-size: 10pt;" class="">import</span></code><span class="Apple-converted-space"> </span>statement names a compilation unit, granting access to any modules it contains. Haskell separately has two restrictions:<o:p class=""></o:p></div><ol start="1" type="1" style="margin-bottom: 0cm;" class=""><li class="MsoNormal" style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">Every compilation unit must contain exactly one module (which may contain other modules); the compilation unit must have the same name as its one module.<o:p class=""></o:p></li><li class="MsoNormal" style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;"><code style="font-family: "Courier New";" class=""><span style="font-size: 10pt;" class="">import</span></code><span class="Apple-converted-space"> </span>statements must go before all other statements (except, optionally, for a<span class="Apple-converted-space"> </span><code style="font-family: "Courier New";" class=""><span style="font-size: 10pt;" class="">module</span></code><span class="Apple-converted-space"> </span>header) in a compilation unit (in order to support finding dependencies while parsing only a prefix of a file).<o:p class=""></o:p></li></ol></blockquote><div class=""><ol start="3" type="1" style="margin-bottom: 0cm; margin-top: 0cm;" class=""><li class="MsoListParagraph" style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">I hope this helps!<o:p class=""></o:p></li></ol><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">Richard<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><br class=""><br class=""><o:p class=""></o:p></div><blockquote style="margin-top: 5pt; margin-bottom: 5pt;" class=""><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">On Jul 23, 2021, at 7:16 AM, Alejandro Serrano Mena <<a href="mailto:trupill@gmail.com" style="color: blue; text-decoration: underline;" class="">trupill@gmail.com</a>> wrote:<o:p class=""></o:p></div></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><o:p class=""> </o:p></div><div class=""><div class=""><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">Re-reading the thread has made me aware of the distinction introduced by this proposal between “top-level” and “local modules”, which I do not fully grasp. I was under the impression that this was working more on the syntactic level (so if I write `module X where module Y where` this is similar to `module X.Y where`), and the specification was about sorting out how this works, but now I’m surprised about this new concept.<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><o:p class=""> </o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">Regards,<o:p class=""></o:p></div></div><div class=""><p class="MsoNormal" style="margin: 0cm 0cm 12pt; font-size: 11pt; font-family: Calibri, sans-serif;">Alejandro<o:p class=""></o:p></p><div class=""><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">El 23 jul 2021 12:00:40, Simon Marlow <<a href="mailto:marlowsd@gmail.com" style="color: blue; text-decoration: underline;" class="">marlowsd@gmail.com</a>> escribió:<o:p class=""></o:p></div></div><blockquote style="border-style: none none none solid; border-left-width: 1pt; border-left-color: rgb(204, 204, 204); padding: 0cm 0cm 0cm 6pt; margin-left: 4.8pt; margin-right: 0cm;" class=""><div class=""><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">Just so I'm not completely silent: in the past I was generally in favour but had some suggestions. It looks like the proposal has undergone a lot of rewrites since I last reviewed it (or perhaps I just don't remember it all that well), I've started to go through it again but this is a biggie!<span class="Apple-converted-space"> </span><o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><o:p class=""> </o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">I think a deadline is a good idea.<o:p class=""></o:p></div></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><o:p class=""> </o:p></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">Cheers<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">Simon<o:p class=""></o:p></div></div></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><o:p class=""> </o:p></div><div class=""><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">On Fri, 23 Jul 2021 at 07:23, Spiwack, Arnaud <<a href="mailto:arnaud.spiwack@tweag.io" style="color: blue; text-decoration: underline;" class="">arnaud.spiwack@tweag.io</a>> wrote:<o:p class=""></o:p></div></div><blockquote style="border-style: none none none solid; border-left-width: 1pt; border-left-color: rgb(204, 204, 204); padding: 0cm 0cm 0cm 6pt; margin-left: 4.8pt; margin-right: 0cm;" class=""><div class=""><div class=""><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">Dear all,<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><o:p class=""> </o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">I know that this proposal is a bit long, but it also deserves your attention.<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><o:p class=""> </o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">I feel it's going to be easier to set a bit of time to review the proposal if I give a deadline. So let's say the following: I'll be on holiday starting two weeks from now (6th August), can I have everybody's opinion by then?<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><o:p class=""> </o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">---<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><o:p class=""> </o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">Recapitulating the opinions so far<o:p class=""></o:p></div></div><div class=""><ul type="disc" style="margin-bottom: 0cm;" class=""><li class="MsoNormal" style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">I'm personally pretty enthusiastic about the entire proposal<o:p class=""></o:p></li><li class="MsoNormal" style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">Tom voiced quite enthusiastic support for what Simon PJ calls (1), and (3)<o:p class=""></o:p></li><li class="MsoNormal" style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">Simon PJ wants (1), is not against (2), is mildly against (3)<o:p class=""></o:p></li><li class="MsoNormal" style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">Joachim suspends his judgement (which is fine, but hopefully not too many of us do this :-) ).<o:p class=""></o:p></li></ul></div></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><o:p class=""> </o:p></div><div class=""><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">On Wed, Jul 21, 2021 at 2:30 PM Simon Peyton Jones <<a href="mailto:simonpj@microsoft.com" target="_blank" style="color: blue; text-decoration: underline;" class="">simonpj@microsoft.com</a>> wrote:<o:p class=""></o:p></div></div><blockquote style="border-style: none none none solid; border-left-width: 1pt; border-left-color: rgb(204, 204, 204); padding: 0cm 0cm 0cm 6pt; margin-left: 4.8pt; margin-right: 0cm;" class=""><div class=""><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">To be clear, I’m ok with (1), luke-warm on (2), and mildly against (3)<o:p class=""></o:p></div><ol start="1" type="1" style="margin-bottom: 0cm;" class=""><li class="MsoNormal" style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">Import and export of qualified names. This seems like the Main Point.<o:p class=""></o:p></li><li class="MsoNormal" style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">Local import (in a let/where). This seems low pain but low gain.<o:p class=""></o:p></li><li class="MsoNormal" style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">Local modules. This is the one I'm struggling with.<o:p class=""></o:p></li></ol><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">There is  more on the (tail end of the) PR<span class="Apple-converted-space"> </span><a href="https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fghc-proposals%2Fghc-proposals%2Fpull%2F283&data=04%7C01%7Csimonpj%40microsoft.com%7C46ab11d6561e40b7dfb608d9505636f2%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637629154431063086%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&sdata=IL2LIK2SWo9Idqrip5I1IQy9pvt02v0tfP9pDmIPV5w%3D&reserved=0" target="_blank" style="color: blue; text-decoration: underline;" class="">https://github.com/ghc-proposals/ghc-proposals/pull/283</a><o:p class=""></o:p></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">I am open to being educated.<o:p class=""></o:p></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><br class="">I would love to hear from other members of the committee.  Tom’s thumbs-up seemed to about (1), without saying anything about (2) and (3).<o:p class=""></o:p></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">One mechanism (if my categorisation is correct) could be to ask everyone to vote (yes/no/maybe) on all of 1,2,3.<o:p class=""></o:p></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">Arnaud, you are our shepherd.  Your sheep await your command.<o:p class=""></o:p></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">Simon<o:p class=""></o:p></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div><div style="border-style: none none none solid; border-left-width: 1.5pt; padding: 0cm 0cm 0cm 4pt; border-color: currentcolor currentcolor currentcolor blue;" class=""><div class=""><div style="border-style: solid none none; border-top-width: 1pt; padding: 3pt 0cm 0cm; border-color: currentcolor;" class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><b class=""><span lang="EN-US" class="">From:</span></b><span lang="EN-US" class=""><span class="Apple-converted-space"> </span>ghc-steering-committee <<a href="mailto:ghc-steering-committee-bounces@haskell.org" target="_blank" style="color: blue; text-decoration: underline;" class="">ghc-steering-committee-bounces@haskell.org</a>><span class="Apple-converted-space"> </span><b class="">On Behalf Of<span class="Apple-converted-space"> </span></b>Richard Eisenberg<br class=""><b class="">Sent:</b><span class="Apple-converted-space"> </span>19 July 2021 21:18<br class=""><b class="">To:</b><span class="Apple-converted-space"> </span>Spiwack, Arnaud <<a href="mailto:arnaud.spiwack@tweag.io" target="_blank" style="color: blue; text-decoration: underline;" class="">arnaud.spiwack@tweag.io</a>><br class=""><b class="">Cc:</b><span class="Apple-converted-space"> </span>GHC Steering Committee <<a href="mailto:ghc-steering-committee@haskell.org" target="_blank" style="color: blue; text-decoration: underline;" class="">ghc-steering-committee@haskell.org</a>><br class=""><b class="">Subject:</b><span class="Apple-converted-space"> </span>Re: [ghc-steering-committee] #283: Local modules (again), recommendation: accept</span><o:p class=""></o:p></div></div></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">Any thoughts on this? Simon PJ seems lukewarm (or maybe even cooler than that), Arnaud is in support, but the rest of you have been quiet.<o:p class=""></o:p></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">Thanks!<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">Richard<o:p class=""></o:p></div><div class=""><div class=""><p class="MsoNormal" style="margin: 0cm 0cm 12pt; font-size: 11pt; font-family: Calibri, sans-serif;"><o:p class=""> </o:p></p><blockquote style="margin-top: 5pt; margin-bottom: 5pt;" class=""><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">On Jun 11, 2021, at 3:05 AM, Spiwack, Arnaud <<a href="mailto:arnaud.spiwack@tweag.io" target="_blank" style="color: blue; text-decoration: underline;" class="">arnaud.spiwack@tweag.io</a>> wrote:<o:p class=""></o:p></div></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div><div class=""><div class=""><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">Dear all,<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">Let me raise this proposal again. Very few of us have opined, and while I'd usually be happy to consider silence as assent, this is a rather large proposal which may require a few more pairs of eyes. Please consider giving this one a read and share your thoughts. If you can't do so right now, please let me know when you will be able to, so that we can plan accordingly.<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">This is an important proposal, I'm keen on seeing its design finalised.<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">/Arnaud<o:p class=""></o:p></div></div></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div><div class=""><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">On Wed, May 26, 2021 at 2:35 PM Richard Eisenberg <<a href="mailto:rae@richarde.dev" target="_blank" style="color: blue; text-decoration: underline;" class="">rae@richarde.dev</a>> wrote:<o:p class=""></o:p></div></div><blockquote style="border-style: none none none solid; border-left-width: 1pt; padding: 0cm 0cm 0cm 6pt; margin: 5pt 0cm 5pt 4.8pt; border-color: currentcolor currentcolor currentcolor rgb(204, 204, 204);" class=""><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div><div class=""><p class="MsoNormal" style="margin: 0cm 0cm 12pt; font-size: 11pt; font-family: Calibri, sans-serif;"><o:p class=""> </o:p></p><blockquote style="margin-top: 5pt; margin-bottom: 5pt;" class=""><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">On May 26, 2021, at 3:28 AM, Spiwack, Arnaud <<a href="mailto:arnaud.spiwack@tweag.io" target="_blank" style="color: blue; text-decoration: underline;" class="">arnaud.spiwack@tweag.io</a>> wrote:<o:p class=""></o:p></div></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div><div class=""><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">I'm realising that I inverted additional options 1 and 3 in my reply. To spell things out: I'm in favour of the namespace introduced for every datatype and such; and weakly in favour of anonymous modules, for which I prefer the `_` syntax than simply omitting the name.<o:p class=""></o:p></div></div></div></blockquote><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">Oh, good. I was very confused here, but I decided not to push on it. I'm similarly weakly in favor of (1), but I can't get myself to decide firmly on whether to go with alternative (7). Going with (7) is a little more consistent with other features, but it adds more symbols to the source text that could otherwise be omitted. So I'm pretty ambivalent.<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">Richard<o:p class=""></o:p></div></div><p class="MsoNormal" style="margin: 0cm 0cm 12pt; font-size: 11pt; font-family: Calibri, sans-serif;"><o:p class=""> </o:p></p><blockquote style="margin-top: 5pt; margin-bottom: 5pt;" class=""><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div><div class=""><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">On Tue, May 25, 2021 at 11:54 PM Richard Eisenberg <<a href="mailto:rae@richarde.dev" target="_blank" style="color: blue; text-decoration: underline;" class="">rae@richarde.dev</a>> wrote:<o:p class=""></o:p></div></div><blockquote style="border-style: none none none solid; border-left-width: 1pt; padding: 0cm 0cm 0cm 6pt; margin: 5pt 0cm 5pt 4.8pt; border-color: currentcolor currentcolor currentcolor rgb(204, 204, 204);" class=""><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div><div class=""><p class="MsoNormal" style="margin: 0cm 0cm 12pt; font-size: 11pt; font-family: Calibri, sans-serif;"><o:p class=""> </o:p></p><blockquote style="margin-top: 5pt; margin-bottom: 5pt;" class=""><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">On May 25, 2021, at 3:09 PM, Alejandro Serrano Mena <<a href="mailto:trupill@gmail.com" target="_blank" style="color: blue; text-decoration: underline;" class="">trupill@gmail.com</a>> wrote:<o:p class=""></o:p></div></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div><div class=""><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><span style="font-size: 9pt; font-family: Helvetica, sans-serif;" class="">- I am not sure of the benefit of allowing (1), compared with the possible surprise of users.</span><o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><span style="font-size: 9pt; font-family: Helvetica, sans-serif;" class="">- I do not fully understand (2).</span><o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><span style="font-size: 9pt; font-family: Helvetica, sans-serif;" class="">- I think (3) would be great, if we ensure that nothing changes if I don’t use “qualified”, even if -XLocalModules is on.</span><o:p class=""></o:p></div></div></div></blockquote></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">If in the language, I would use (1) -- anonymous local modules -- regularly, when defining a function or class instance with a bunch of "local" helper functions. Of course, if we can't omit the module name, I will suffer no great harm.<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">I cannot offer the guarantee you seek in (3), but I don't think you want it. (If nothing changes, then the feature has no effect!) Here is a scenario where (3) could cause trouble:<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div></div><blockquote style="margin-top: 5pt; margin-bottom: 5pt;" class=""><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">import Data.Set as Set ( abcde )<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">data Set = Mk { abcdf :: Int }<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">blah = Set.abcdf<o:p class=""></o:p></div></div></blockquote><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">Previously, GHC would have suggested that you perhaps misspelled abcde. Now, you'll get (presumably) a type error.<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">Here's another case:<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div></div><blockquote style="margin-top: 5pt; margin-bottom: 5pt;" class=""><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">import Data.Set as Set ( Set )<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">data Set = Mk<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">x :: Set.Set<o:p class=""></o:p></div></div></blockquote><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">Everything is happy today, but with -XLocalModules (and (3)), the type of x is an ambiguous name.<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">Any example that causes trouble, though, will have something in common: an imported module name (possibly via an alias) that matches a locally defined type name. I would imagine this pattern is rare in practice, and that the benefit of (3) would outweigh the number of times that a problem like this bites.<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">I, too, could live without (2).<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">Richard<o:p class=""></o:p></div></div></div></blockquote></div></div></blockquote></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div></div></blockquote></div></div></blockquote></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class=""> <o:p class=""></o:p></div></div></div></div></div></div></blockquote></div></div><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">_______________________________________________<br class="">ghc-steering-committee mailing list<br class=""><a href="mailto:ghc-steering-committee@haskell.org" target="_blank" style="color: blue; text-decoration: underline;" class="">ghc-steering-committee@haskell.org</a><br class=""><a href="https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fmail.haskell.org%2Fcgi-bin%2Fmailman%2Flistinfo%2Fghc-steering-committee&data=04%7C01%7Csimonpj%40microsoft.com%7C46ab11d6561e40b7dfb608d9505636f2%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637629154431073081%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&sdata=7j7afOKKTr63mDs95flG53ii7eo6QSjSFyRdOvp1MUU%3D&reserved=0" target="_blank" style="color: blue; text-decoration: underline;" class="">https://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-steering-committee</a><o:p class=""></o:p></div></blockquote></div><div class=""><div class=""><div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">_______________________________________________<br class="">ghc-steering-committee mailing list<br class=""><a href="mailto:ghc-steering-committee@haskell.org" style="color: blue; text-decoration: underline;" class="">ghc-steering-committee@haskell.org</a><br class=""><a href="https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fmail.haskell.org%2Fcgi-bin%2Fmailman%2Flistinfo%2Fghc-steering-committee&data=04%7C01%7Csimonpj%40microsoft.com%7C46ab11d6561e40b7dfb608d9505636f2%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637629154431083081%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&sdata=bOtq6xjhCSuB8aPjr4K2lftRJIRtpGOQ9wyLY%2Fhn1q8%3D&reserved=0" style="color: blue; text-decoration: underline;" class="">https://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-steering-committee</a></div></div></div></blockquote></div></div></div></div></blockquote></div></div></div></div></div></blockquote></div><br class=""></body></html>