> On Feb 21, 2017, at 12:45 PM, Gracjan Polak <[email protected]> wrote: > > Hi all, > > I was thinking about implementing @Type syntax > <https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#visible-type-application> > highlight for haskell-mode <https://github.com/haskell/haskell-mode> and > noticed a rule about spacing required before @-sign.
Thanks for looking into this! > > I do not understand where does this rule come from and what does it buy us. > > Experimentation shows that @-patterns do not care about spaces at all: Quite true. > > Comment next to implementation says: "This, of course, conflicts with > as-patterns. The conflict arises because expressions and patterns use the > same parser, and also because we want to allow type patterns within > expression patterns." > > As I understand pattern and expression contexts are always separate in > Haskell so the part just after 'of course' is not clear to me. Sadly, this is not true. We don’t always know whether we’re parsing an expression or a pattern. Specifically, imagine this prefix of a Haskell definition: foo = do Just x Is `Just x` the result of `foo`? If so, then `Just x` is an expression. Or is this the beginning of `Just x <- blargh`. If so, then `Just x` is a pattern. We don’t know until we see either a semicolon (possibly inserted by layout rules) or an arrow, which could be arbitrarily far away. So we must have a combined expression/pattern parser. > > Can I get an example for "we want to allow type patterns within expression > patterns”? This is to allow for future expansion of the @Type syntax, to allow usage in patterns. For example we might want id :: a -> a id @b x = (x :: b) where the @b brings b, a scoped type variable, into scope. > > I understand the part "expressions and patterns use the same parser" but then > I'd rather file a bug report about this one. > > Rationale: I'd rather limit usage for horizontal space to separate tokens on > the lexer level. With -XTypeApplications, GHC lexes ‘ @‘ and ‘@‘ separately. (Actually, the ‘ @‘ lexeme doesn’t require a space there -- just something that cannot appear in an identifier). As-patterns require the ‘@‘ lexeme, while type applications require the ’ @‘ lexeme. When -XTypeApplications is not turned on, this change in lexer behavior is not enabled. > This looks like it tries to promote space to separate things on parser level, > which is rather hard to get right in crude parsers that we have for syntax > highligh, indentation, completion and the like. This is a really good point, and something we should keep in mind as we continue to tinker with syntax. Perhaps the ghc-proposals process will bring such problems to light sooner. I’m sorry our design decisions here have caused trouble! Richard > > -- > Gracjan > > _______________________________________________ > ghc-devs mailing list > [email protected] > http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
_______________________________________________ ghc-devs mailing list [email protected] http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
