[Haskell-cafe] Proposal: Shorter Import Syntax

Richard Eisenberg eir at cis.upenn.edu
Wed Jun 3 17:43:12 UTC 2015


I have to say I'm a big -1 on the proposed syntax -- it's awfully confusing to have the import list mean something entirely different before the `as` compared to after the `as`. I proposed a different syntax on the ticket (https://ghc.haskell.org/trac/ghc/ticket/10478#comment:3), which I paste here for ease of access.

---
I'm in favor of abbreviating the syntax in this common scenario, but I don't like your choice of syntax, I'm afraid. It would give

{{{
import Data.Map (Map) as M    -- (1)
}}}

a very different meaning from

{{{
import Data.Map as M (Map)    -- (2)
}}}

(1) imports all of `Data.Map`, qualified with the alias `M`, and imports the name `Map` unqualified. (2) imports only the name `Map` (unqualified) while also aliasing `Data.Map`.
Having these two coexist seems like we're asking users to be confused.

What about

{{{
import Data.Map (Map)
  qualified as M *
}}}

?

The general schema, which replaces the current syntax. This schema does not permit some current syntax, but it would be easy to extend it to be backward-compatible. I've chosen not to for this presentation to avoid clutter.

{{{
import_statement  ::= 'import' module_name maybe_name_list import_specifiers
module_name       ::= ...
maybe_name_list   ::= name_list | <empty>
name_list         ::= '(' names ')' | '*'
import_specifiers ::= <empty> | import_specifier import_specifiers
import_specifier  ::= 'hiding' name_list | qualified_spec name_list
qualified_spec    ::= 'qualified' | 'qualified' 'as' name
}}}

The top-level `maybe_name_list` would list all unqualified imports. If it is omitted, and there are no `qualified_spec`s, then all names would be imported unqualified. If it is omitted and there are one or more `qualified_spec`s, then no names would be imported unqualified.

Each `import_specifier` either adds qualified names (perhaps under a module synonym) or removes names. Removing names with `hiding` removes those names from the `qualified_spec` (or top-level `maybe_name_list`) immediately preceding the `hiding`.

The special `name_list` `*` (note that it is ''not'' in parentheses, to avoid ambiguity) means "all names".

This schema allows one import statement to import a mix of qualified and unqualified names, and even allows using different module synonyms for different sets of qualified names. The legacy `import` syntax could desugar to this form, which seems strictly more expressive. For example:

{{{
import qualified Foo       -->  import Foo qualified *
import qualified Bar as B  -->  import Bar qualified as B *
import Baz hiding (wurble) -->  import Baz hiding (wurble)
}}}

Thoughts?

Richard

On Jun 3, 2015, at 1:31 PM, Adam Bergmark <adam at bergmark.nl> wrote:

> +1, I thought of the exact same syntax at some point.
> 
> On Wed, Jun 3, 2015 at 7:18 PM, Michael Snoyman <michael at snoyman.com> wrote:
> That's nifty. Just about every module in the project I'm working on now has two lines like the former (and the same for Set). I like the new syntax, +1.
> 
> On Wed, Jun 3, 2015 at 8:15 PM Anthony Cowley <acowley at seas.upenn.edu> wrote:
> Hi Everyone,
> 
> I didn't think this would see any resistance as it doesn't break
> anything, but this is the internet, so, if you haven't already, take a
> look at this GHC feature request
> <https://ghc.haskell.org/trac/ghc/ticket/10478>
> 
> The idea is that rather than writing,
> 
> import Data.Map (Map)
> import qualified Data.Map as M
> 
> you could instead write,
> 
> import Data.Map (Map) as M
> 
> The Map identifier would imported unqualified, while M would be
> introduced as an alias for the qualified import of Data.Map.
> 
> Note that, currently, following a parenthesized group with the "as"
> keyword is a parse error. So allowing this syntax would not affect any
> currently working programs.
> 
> I've mentioned this proposal before and gotten good response, so I
> finally wrote it up last night after people on IRC responded
> positively to it. As well as IRC and trac, I put the link up on
> Twitter to get it in front of a large audience, and here's what we
> have after a bit over 12 hours (not counting the handful of supporters
> in IRC):
> 
> +20
> -2
> 
> You can see the tweet at
> <https://twitter.com/a_cowley/status/605909841148702720>
> 
> I'll try to summarize the two negative votes: 1) This isn't that big a
> burden, and we should instead focus on controlled export of class
> instances; and 2) We should instead focus on exporting name spaces,
> and that the ordering of parentheses and the "as" keyword is too close
> to the existing "import Foo as F(foo)" syntax.
> 
> Since there are these negative votes, I think it best if as many
> people as possible at least see the proposal so the GHC developers can
> get a better sense for the overall response.
> 
> Anthony
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
> 
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
> 
> 
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20150603/d5a85928/attachment.html>


More information about the Haskell-Cafe mailing list