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
71 lines
2.6 KiB
Text
71 lines
2.6 KiB
Text
/-
|
||
Copyright (c) 2025 Lean FRO, LLC. All rights reserved.
|
||
Released under Apache 2.0 license as described in the file LICENSE.
|
||
Authors: Joseph Rotella
|
||
-/
|
||
module
|
||
|
||
prelude
|
||
public import Lean.ErrorExplanation
|
||
meta import Lean.ErrorExplanation
|
||
|
||
public section
|
||
|
||
/--
|
||
This error occurs when an inductive type constructor is partially applied in the type of one of its
|
||
constructors such that one or more parameters of the type are omitted. The elaborator requires that
|
||
all parameters of an inductive type be specified everywhere that type is referenced in its
|
||
definition, including in the types of its constructors.
|
||
|
||
If it is necessary to allow the type constructor to be partially applied, without specifying a given
|
||
type parameter, that parameter must be converted to an index. See the manual section on
|
||
[Inductive Types](lean-manual://section/inductive-types) for further explanation of the difference
|
||
between indices and parameters.
|
||
|
||
# Examples
|
||
|
||
## Omitting Parameter in Argument to Higher-Order Predicate
|
||
|
||
```lean broken
|
||
inductive List.All {α : Type u} (P : α → Prop) : List α → Prop
|
||
| nil : All P []
|
||
| cons {x xs} : P x → All P xs → All P (x :: xs)
|
||
|
||
structure RoseTree (α : Type u) where
|
||
val : α
|
||
children : List (RoseTree α)
|
||
|
||
inductive RoseTree.All {α : Type u} (P : α → Prop) (t : RoseTree α) : Prop
|
||
| intro : P t.val → List.All (All P) t.children → All P t
|
||
```
|
||
```output
|
||
Missing parameter(s) in occurrence of inductive type: In the expression
|
||
List.All (All P) t.children
|
||
found
|
||
All P
|
||
but expected all parameters to be specified:
|
||
All P t
|
||
|
||
Note: All occurrences of an inductive type in the types of its constructors must specify its fixed parameters. Only indices can be omitted in a partial application of the type constructor.
|
||
```
|
||
```lean fixed
|
||
inductive List.All {α : Type u} (P : α → Prop) : List α → Prop
|
||
| nil : All P []
|
||
| cons {x xs} : P x → All P xs → All P (x :: xs)
|
||
|
||
structure RoseTree (α : Type u) where
|
||
val : α
|
||
children : List (RoseTree α)
|
||
|
||
inductive RoseTree.All {α : Type u} (P : α → Prop) : RoseTree α → Prop
|
||
| intro : P t.val → List.All (All P) t.children → All P t
|
||
```
|
||
Because the `RoseTree.All` type constructor must be partially applied in the argument to `List.All`,
|
||
the unspecified argument (`t`) must not be a parameter of the `RoseTree.All` predicate. Making it an
|
||
index to the right of the colon in the header of `RoseTree.All` allows this partial application to
|
||
succeed.
|
||
-/
|
||
register_error_explanation lean.inductiveParamMissing {
|
||
summary := "Parameter not present in an occurrence of an inductive type in one of its constructors."
|
||
sinceVersion := "4.22.0"
|
||
}
|