
On Fri, Jun 11, 2021, at 06:14, Spiwack, Arnaud wrote:
* I’m rather unsure what to think about regarding the non-total priority (the fact that you can have `default C (A, B); default D (B, A)` and need to default a variable `x` with `(C x, D x)`). This sounds like something that must at least be specified. Am I correct that it isn’t?
It is specified to be a static error, and the solution is either - define your own, consistent default rules for C and D in the current module, OR - ascribe types to the ambiguous use-sites and bypass default resolution entirely. See sections [2.5] and [5.1] in the proposal. It's a bit of a sharp edge, to be sure. But defaulting rules are anti-modular much like type classes, and I think this is the most sensible thing to do here. [2.5]: https://github.com/blamario/ghc-proposals/blob/exportable-named-default/prop... [5.1]: https://github.com/blamario/ghc-proposals/blob/exportable-named-default/prop...
* Regarding imports: in a first approximation explicit imports are useless. Having implicit imports lets me, for instance, define `default IsList ([])` in the prelude, and then turn `OverloadedList` on in `GHC2023` and not break existing programs.
There's a bit of a subtlety here in the use of "explicit" vs "implicit", and I'm not sure how you're using them here. We have at least three proposals for the behavior of imports. Given ``` module Defaults where default IsString (Text) ``` (A) Fully implicit (like class instances) ``` import Defaults -- imports `default IsString (Text)` import Defaults () -- imports `default IsString (Text)` ``` (B) Fully explicit (Richard's preference, I believe) ``` import Defaults -- does not import `default IsString (Text)` import Defaults () -- does not import `default IsString (Text)` import Defaults (default IsString) -- imports `default IsString (Text)` ``` (C) Like normal values ``` import Defaults -- imports `default IsString (Text)` import Defaults () -- does not import `default IsString (Text)` import Defaults (default IsString) -- imports `default IsString (Text)` ``` Since the Prelude is implicitly imported without an import list, both A and C would let you avoid an extra import. Same goes for Prelude replacements. Eric