This PR improves the error message encountered in the case of a type class instance resolution failure, and adds an error explanation that discusses the common new-user case of binary operation overloading and points to the `trace.Meta.synthInstance` option for advanced debugging. ## Example ```lean4 def f (x : String) := x + x ``` Before: ``` failed to synthesize HAdd String String ?m.5 Hint: Additional diagnostic information may be available using the `set_option diagnostics true` command. ``` After: ``` failed to synthesize instance of type class HAdd String String ?m.5 Hint: Type class instance resolution failures can be inspected with the `set_option trace.Meta.synthInstance true` command. Error code: lean.failedToSynthesizeTypeclassInstance [View explanation](https://lean-lang.org/doc/reference/latest/find/?domain=Manual.errorExplanation&name=lean.failedToSynthesizeTypeclassInstance) ``` The error message is changed in three important ways: * Explains *what* failed to synthesize, using the "type class" terminology that's more likely to be recognized than the "instance" terminology * Points to the `trace.Meta.synthInstance` option which is otherwise nearly undiscoverable but is quite powerful (see also leanprover/reference-manual#663 which is adding commentary on this option) * Gives an error explanation link (which won't actually work until the next release after this is merged) which prioritizes the common-case explanation of using the wrong binary operation
82 lines
2.3 KiB
Text
82 lines
2.3 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 instance of type class
|
||
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
|
||
|
||
Hint: Type class instance resolution failures can be inspected with the `set_option trace.Meta.synthInstance true` command.
|
||
-/
|
||
#guard_msgs in
|
||
#check (1 : String)
|
||
|
||
/--
|
||
error: failed to synthesize instance of type class
|
||
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
|
||
|
||
Hint: Type class instance resolution failures can be inspected with the `set_option trace.Meta.synthInstance true` command.
|
||
-/
|
||
#guard_msgs in
|
||
#check (1 : Bool)
|
||
|
||
/--
|
||
error: failed to synthesize instance of type class
|
||
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
|
||
|
||
Hint: Type class instance resolution failures can be inspected with the `set_option trace.Meta.synthInstance true` command.
|
||
-/
|
||
#guard_msgs in
|
||
#check (1 : Bool → Nat)
|
||
|
||
/--
|
||
error: failed to synthesize instance of type class
|
||
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
|
||
|
||
Hint: Type class instance resolution failures can be inspected with the `set_option trace.Meta.synthInstance true` command.
|
||
-/
|
||
#guard_msgs in
|
||
def foo : String :=
|
||
let x := 0
|
||
x ++ x
|