Fix the lexical syntax for qualified identifiers

Ticket: #59

The lexical rules for qualified identifiers lead to some unexpected consequences, and are tricky to implement, such that several existing compilers don't implement them properly.


  • M.where should be 2 lexemes, M.wher and e. (Hugs treats it as 1, GHC treats it as 3 (see
  • M... should be 2 lexemes, M.. and . (.. is a reserved symbol and can't be qualified, neigther GHC nor Hugs implements this)
  • M.\ should be 2 lexemes, M and .\

The trickiness in implementation is due to the lookahead required.

Fixing the lexical syntax is easy, we define

id -> small {small|large|digit|'}
varid -> id<reservedid>

qvarid -> [ modid . ] id

and similarly for qualified symbols.

See also CompositionAsDot, which supercedes this proposal if adopted.


  • treating M.where as a qualified variable isn't very useful, since you can't define a variable called where. Perhaps it should be possible to use qualified identifiers in a definition, to make this consistent again?


  • the consequences of the current lexical syntax are ugly (M.wher e ?) and unintentional.
  • most compilers don't get it right anyway, this is just a small change that makes it easier to implement Haskell.
Last modified 11 years ago Last modified on Mar 13, 2007 3:06:19 PM