Admin message

Due to a large amount of spam we do not allow new users to create repositories, they are "external" users. If you are a new user and want to create a repository, for example for forking GHC, open a new issue on ghc/ghc using the "get-verified" issue template

Error message hints: use the env instead of the namespace
This ticket describes a problem related to `RequiredTypeArguments`. ## Background When a type variable is used at the term level, GHC assumes the user might have made a typo and suggests a term variable with a similar name. For example, if the user writes ```haskell f (Proxy :: Proxy nap) (Proxy :: Proxy gap) = nap (+1) [1,2,3] ``` then GHC will helpfully suggest `map` instead of `nap` ``` • Illegal term-level use of the type variable ‘nap’ • Perhaps use ‘map’ (imported from Prelude) ``` Importantly, GHC does _not_ suggest `gap`, which is in scope. * **Question:** How does GHC know not to suggest `gap`? After all, the edit distance between `map`, `nap`, and `gap` is equally short. * **Answer:** GHC takes the namespace into consideration. `gap` is a `tvName`, and GHC would only suggest a `varName` at the term level. In other words, the current hint infrastructure assumes that the namespace of an entity is a reliable indicator of its level * term-level name <=> term-level entity * type-level name <=> type-level entity ## Problem With `RequiredTypeArguments`, the above assumption does not hold. Consider ``` bad :: forall a b -> ... bad nap gap = nap ``` This use of `nap` on the RHS is illegal because `nap` stands for a type variable. It cannot be returned as the result of a function. At the same time, it is bound as a `varName`, i.e. in the term-level namespace. Unless we suppress hints, GHC gets awfully confused ``` • Illegal term-level use of the variable ‘nap’ • Perhaps use one of these: ‘nap’ (line 2), ‘gap’ (line 2), ‘map’ (imported from Prelude) ``` GHC shouldn't suggest `gap`, which is also a type variable; using it would result in the same error. And it especially shouldn't suggest using `nap` instead of `nap`, which is absurd. ## Workaround A simple workaround is to suppress the hints as long as `RequiredTypeArguments` is enabled. Naturally, this also means that error messages are less helpful with `RequiredTypeArguments`, so it's not a proper solution. ## Solution The proper solution is to overhaul the hint system to consider what a name stands for instead of looking at its namespace alone. This information is present in the type checking environment. ## Plan My plan is to go with the workaround in !11682 and implement the proper solution afterwards. This ticket is to track this task.
issue