[ghc-steering-committee] Proposal #270: Support pun-free code. Recommendation: accept
Adam Gundry
adam at well-typed.com
Mon Dec 12 12:21:53 UTC 2022
On 12/12/2022 11:39, Simon Peyton Jones wrote:
> {-# LANGUAGE ExplicitNamespaces #-}
> module N where
> import M (T(type MkT)) -- NB "type" import of a data constructor
> v = MkT -- usage at term level
>
>
> Crumbs. I had not realised the proposal is to allow *nested* uses of
> 'type' in import lists, as you show above.
The nested use is already possible with ExplicitNamespaces. Currently it
allows
import M (T(type MkT))
import M (type MkT)
import M (pattern MkT)
whereas the proposal extends it to add the possibility to write
import M type (MkT)
import M data (MkT)
import M (data MkT)
> In general, I don't feel the extensions to ExplicitNamespaces included
> in the proposal are very clearly specified.
>
>
> Actually isn't the proposal pretty clear on this, namely the first
> bullet of proposed change spec
> <https://github.com/hithroc/ghc-proposals/blob/master/proposals/0000-support-pun-free-code.md#2-proposed-change-specification>. It only covers
> import M *type *
> import M *data *as MD
> where I have emboldened the new bits. Nothing about the contents of
> import lists. Why did you think your example is covered by the proposal?
I'm trying to understand what
import M type (MkT)
means where MkT is a data constructor (or if it raises some kind of
error). This was by analogy to the existing
import M (T(type MkT))
which means something today, albeit not necessarily a very sensible
thing (per https://gitlab.haskell.org/ghc/ghc/-/issues/22581).
I don't see a clear specification of the proposed (extended) semantics
of ExplicitNamespaces in the proposal, but perhaps I've missed something?
Cheers,
Adam
> On Mon, 12 Dec 2022 at 09:15, Adam Gundry <adam at well-typed.com
> <mailto:adam at well-typed.com>> wrote:
>
> Actually, reading https://gitlab.haskell.org/ghc/ghc/-/issues/22581
> <https://gitlab.haskell.org/ghc/ghc/-/issues/22581> I
> realised I'm unclear how the proposed extensions to ExplicitNamespaces
> are supposed to work. The existing situation is apparently that for a
> (non-punned) data constructor, it is possible to use either a
> pattern or
> type qualifier in an import list (presumably because DataKinds means
> the
> constructor is in scope at both the term and type levels), and the
> imported constructor is then usable in both contexts.
>
> For example, the following is accepted at present:
>
> module M where
> data T = MkT
>
> {-# LANGUAGE ExplicitNamespaces #-}
> module N where
> import M (T(type MkT)) -- NB "type" import of a data constructor
> v = MkT -- usage at term level
>
> The present proposal says "With type specified in the import, only
> identifiers belonging to the type namespace will be brought into the
> scope." I'm not exactly sure how to interpret this, does it mean the
> following alternative will be accepted or rejected?
>
> module N where
> import M type (MkT)
> v = MkT
>
> I'm worried we will end up with a situation where ExplicitNamespaces
> does subtly different things depending on the position of the keyword.
>
> In general, I don't feel the extensions to ExplicitNamespaces included
> in the proposal are very clearly specified. Given the discussion about
> exactly which parts belong to ExplicitNamespaces/PatternSynonyms versus
> separate extensions, perhaps we should accept the parts relating to
> -Wpuns/-Wpun-bindings, but ask for the ExplicitNamespaces changes to be
> proposed separately?
>
> Cheers,
>
> Adam
>
>
> On 09/12/2022 11:11, Adam Gundry wrote:
> > I'm broadly in favour of accepting the proposal. I realise the
> history
> > is complex here, so I don't think we should ask anyone to rewrite
> things
> > further, though in general it would be nicer to have separate
> proposals
> > for -Wpuns/-Wpun-bindings (which is unambiguously fine) and for the
> > changes to imports (which as Joachim points out raise issues).
> >
> > I'm a bit concerned that the proposal does not motivate or specify
> > -Wpattern-namespace-qualified very well.
> >
> >
> > On 08/12/2022 08:33, Joachim Breitner wrote:
> >> ...
> >>
> >> This gives us (at least) these options:
> >>
> >> 1. Leave ExplicitNamespaces alone, add ExplicitNamespaces to
> GHC2023,
> >> introduce one or two new extensions for the newer changes.
> >> 2. Extend ExplicitNamespaces, and don’t add it already to GHC2023,
> >> disregarding issue #551.
> >> 3. Add ExplicitNamespaces to GHC2023, and still add it to GHC2023,
> >> arguing that GHC20xx allows more liberal (backward-compatibile)
> >> changes than, say, Haskell2010 would allow.
> >>
> >> Certainly 1 is the least bold move. I am not sure what the best way
> >> forwards is, and welcome other opinions.
> >
> > I would prefer a variant of 1: allow "data" as a keyword in
> import lists
> > under ExplicitNamespaces, but make the other changes under other
> > extensions.
> >
> > As I've said previously, I have a general preference for multiple
> small,
> > orthogonal extensions rather than changing existing extensions to
> add
> > unrelated features that happen to be in similar territory. I realise
> > this is controversial, of course.
> >
> > Cheers,
> >
> > Adam
--
Adam Gundry, Haskell Consultant
Well-Typed LLP, https://www.well-typed.com/
Registered in England & Wales, OC335890
27 Old Gloucester Street, London WC1N 3AX, England
More information about the ghc-steering-committee
mailing list