The implicit parameter isn't actually very relevant to the CallStack machinery, so we hide the implementation details behind a constraint alias
type HasCallStack = (?callStack :: CallStack)
This has a few benefits:
- No need to enable ImplicitParams in user code.
- No need to remember the ?callStack naming convention.
- Gives us the option to change the implementation details in the future with less user-land breakage.
The revised CallStack API is exported from GHC.Stack and makes no mention of the implicit parameter.