Many thanks for Patrick Massot for providing the new section at https://leanprover.zulipchat.com/#narrow/stream/270676-lean4/topic/semantic.20highlighting.20doc/near/294953547
47 lines
1.9 KiB
Markdown
47 lines
1.9 KiB
Markdown
## Auto Bound Implicit Arguments
|
||
|
||
In the previous section, we have shown how implicit arguments make functions more convenient to use.
|
||
However, functions such as `compose` are still quite verbose to define. Note that the universe
|
||
polymorphic `compose` is even more verbose than the one previously defined.
|
||
|
||
```lean
|
||
universe u v w
|
||
def compose {α : Type u} {β : Type v} {γ : Type w}
|
||
(g : β → γ) (f : α → β) (x : α) : γ :=
|
||
g (f x)
|
||
```
|
||
|
||
You can avoid the `universe` command by providing the universe parameters when defining `compose`.
|
||
|
||
```lean
|
||
def compose.{u, v, w}
|
||
{α : Type u} {β : Type v} {γ : Type w}
|
||
(g : β → γ) (f : α → β) (x : α) : γ :=
|
||
g (f x)
|
||
```
|
||
|
||
Lean 4 supports a new feature called *auto bound implicit arguments*. It makes functions such as
|
||
`compose` much more convenient to write. When Lean processes the header of a declaration,
|
||
any unbound identifier is automatically added as an implicit argument *if* it is a single lower case or
|
||
greek letter. With this feature, we can write `compose` as
|
||
|
||
```lean
|
||
def compose (g : β → γ) (f : α → β) (x : α) : γ :=
|
||
g (f x)
|
||
|
||
#check @compose
|
||
-- {β : Sort u_1} → {γ : Sort u_2} → {α : Sort u_3} → (β → γ) → (α → β) → α → γ
|
||
```
|
||
Note that, Lean inferred a more general type using `Sort` instead of `Type`.
|
||
|
||
Although we love this feature and use it extensively when implementing Lean,
|
||
we realize some users may feel uncomfortable with it. Thus, you can disable it using
|
||
the command `set_option autoImplicit false`.
|
||
```lean
|
||
set_option autoImplicit false
|
||
/- The following definition produces `unknown identifier` errors -/
|
||
-- def compose (g : β → γ) (f : α → β) (x : α) : γ :=
|
||
-- g (f x)
|
||
```
|
||
The Lean language server provides [semantic highlighting](./semantic_highlighting.md) information to editors, and it provides
|
||
visual feedback whether an identifier has been interpreted as an auto bound implicit argument.
|