This PR modifies the pretty printing of pi types. Now `∀` will be preferred over `→` for propositions if the domain is not a proposition. For example, `∀ (n : Nat), True` pretty prints as `∀ (n : Nat), True` rather than as `Nat → True`. There is also now an option `pp.foralls` (default true) that when false disables using `∀` at all, for pedagogical purposes. This PR also adjusts instance implicit binder pretty printing — nondependent pi types won't show the instance binder name. Closes #1834. The linked RFC also suggests using `_` for binder names in case of non-dependance. We're tabling that idea. Potentially it is useful for hygienic names; this could improve how `Nat → True` pretty prints as `∀ (a : Nat), True`, with this `a` that's chosen by implication notation elaboration. Relatedly, this PR exposes even further the issue where binder names are reused in a confusing way. Consider: `Nat → Nat → (a : Nat) → a = a` pretty prints as `∀ (a a a : Nat), a = a`.
21 lines
942 B
Text
21 lines
942 B
Text
synthorder.lean:4:0-4:40: error: instance does not provide concrete values for (semi-)out-params
|
||
Foo A (B × ?C)
|
||
synthorder.lean:7:0-7:38: error: cannot find synthesization order for instance @instFooNat with type
|
||
{A : Type} → [Foo A Nat] → Foo Nat A
|
||
all remaining arguments have metavariables:
|
||
Foo ?A Nat
|
||
[Meta.synthOrder] synthesizing the arguments of @instFoo in the order [3, 4]:
|
||
Foo A B
|
||
Foo B C
|
||
[Meta.synthOrder] synthesizing the arguments of @instFoo_1 in the order [4, 3]:
|
||
Foo A B
|
||
Foo B C
|
||
[Meta.synthOrder] synthesizing the arguments of @instFooOption in the order []:
|
||
[Meta.synthOrder] synthesizing the arguments of @TwoHalf.toTwo in the order [2]:
|
||
TwoHalf α
|
||
[Meta.synthOrder] synthesizing the arguments of @Four.toThree in the order [4]:
|
||
Four α β
|
||
[Meta.synthOrder] synthesizing the arguments of @instFourOfThree in the order [4, 2, 3]:
|
||
Three α β
|
||
One β
|
||
TwoHalf β
|