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
29 lines
1 KiB
Text
29 lines
1 KiB
Text
class Fintype (α : Type u) where
|
||
|
||
class Preorder (α : Type u) extends LT α, LE α where
|
||
lt := fun a b => a ≤ b ∧ ¬b ≤ a
|
||
|
||
structure Mappish (dIn dOut : Type u) [Fintype dIn] [Fintype dOut] where
|
||
k : Nat
|
||
|
||
variable {dIn dOut dOut₂ : Type} [Fintype dIn] [Fintype dOut] [Fintype dOut₂]
|
||
|
||
def IsGood [DecidableEq dOut] [DecidableEq dOut₂] (Λ : Mappish dIn dOut) (Λ₂ : Mappish dIn dOut₂) : Prop :=
|
||
∃ (D : Mappish dOut (dOut₂)), D.k = Λ.k + Λ₂.k
|
||
|
||
/--
|
||
error: failed to synthesize instance of type class
|
||
Fintype v
|
||
|
||
Hint: Type class instance resolution failures can be inspected with the `set_option trace.Meta.synthInstance true` command.
|
||
-/
|
||
#guard_msgs in
|
||
def MappishOrder [DecidableEq dIn] : Preorder
|
||
(Σ dOut : Sigma (fun t ↦ Fintype t × DecidableEq t), let fin := dOut.snd.1; Mappish dIn dOut.fst) where
|
||
le Λ₁ Λ₂ := by
|
||
let u := Λ₁.fst.fst;
|
||
let v := Λ₂.fst.fst;
|
||
let ⟨w,x⟩ := Λ₁.fst.snd;
|
||
let ⟨y,z⟩ := Λ₂.fst.snd;
|
||
clear y;
|
||
exact @IsGood dIn v u _ _ _ _ _ Λ₂.snd Λ₁.snd
|