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`.
82 lines
2.1 KiB
Text
82 lines
2.1 KiB
Text
universe u
|
||
|
||
/--
|
||
error: numerals are data in Lean, but the expected type is a proposition
|
||
True : Prop
|
||
-/
|
||
#guard_msgs in
|
||
#check (1 : True)
|
||
|
||
/--
|
||
error: numerals are data in Lean, but the expected type is universe polymorphic and may be a proposition
|
||
α : Sort u
|
||
-/
|
||
#guard_msgs in
|
||
def f (α : Sort u) : α :=
|
||
1
|
||
|
||
/--
|
||
error: numerals are data in Lean, but the expected type is universe polymorphic and may be a proposition
|
||
α : Sort u
|
||
---
|
||
info: fun {α} => id (id sorry) : {α : Sort u} → α
|
||
-/
|
||
#guard_msgs in
|
||
#check fun {α : Sort u} => id (α := α) (id 0)
|
||
|
||
/--
|
||
error: numerals are data in Lean, but the expected type is a proposition
|
||
∀ (n : Nat), True : Prop
|
||
-/
|
||
#guard_msgs in
|
||
#check (1 : ∀ (n : Nat), True)
|
||
|
||
/--
|
||
error: failed to synthesize
|
||
OfNat String 1
|
||
numerals are polymorphic in Lean, but the numeral `1` cannot be used in a context where the expected type is
|
||
String
|
||
due to the absence of the instance above
|
||
|
||
Additional diagnostic information may be available using the `set_option diagnostics true` command.
|
||
-/
|
||
#guard_msgs in
|
||
#check (1 : String)
|
||
|
||
/--
|
||
error: failed to synthesize
|
||
OfNat Bool 1
|
||
numerals are polymorphic in Lean, but the numeral `1` cannot be used in a context where the expected type is
|
||
Bool
|
||
due to the absence of the instance above
|
||
|
||
Additional diagnostic information may be available using the `set_option diagnostics true` command.
|
||
-/
|
||
#guard_msgs in
|
||
#check (1 : Bool)
|
||
|
||
/--
|
||
error: failed to synthesize
|
||
OfNat (Bool → Nat) 1
|
||
numerals are polymorphic in Lean, but the numeral `1` cannot be used in a context where the expected type is
|
||
Bool → Nat
|
||
due to the absence of the instance above
|
||
|
||
Additional diagnostic information may be available using the `set_option diagnostics true` command.
|
||
-/
|
||
#guard_msgs in
|
||
#check (1 : Bool → Nat)
|
||
|
||
/--
|
||
error: failed to synthesize
|
||
OfNat String 0
|
||
numerals are polymorphic in Lean, but the numeral `0` cannot be used in a context where the expected type is
|
||
String
|
||
due to the absence of the instance above
|
||
|
||
Additional diagnostic information may be available using the `set_option diagnostics true` command.
|
||
-/
|
||
#guard_msgs in
|
||
def foo : String :=
|
||
let x := 0
|
||
x ++ x
|