Zulip Chat Archive
Stream: lean4
Topic: Nested structure delaborator
Patrick Massot (Oct 13 2023 at 21:44):
This is asking for community feedback before opening a Lean 4 RFC. Consider the following code:
structure A where
x : Nat
structure B extends A where
y : Nat
#check ({ x := 1, y := 2 } : B) -- { toA := { x := 1 }, y := 2 } : B
Lean understands what I mean by ({ x := 1, y := 2 } : B)
, and it also understands { x := 1, y := 2 : B }
. But it always displays { toA := { x := 1 }, y := 2 } : B
. I think it should delaborate this to { x := 1, y := 2 }
. This is especially common in Mathlib which has deeply nested structures. Note that Lean 3 had the same behavior, but nested structures were a lot less common.
Shreyas Srinivas (Oct 13 2023 at 21:59):
Taking this even further, wouldn't it be convenient if it was in fact {x := 1, y := 2}
rather than just delaborating to it? not only is it convenient, given let h := {x := 1, y := 2 : B}
one might try to access h.x
rather than h.toA.x
and get errors.
Patrick Massot (Oct 13 2023 at 22:29):
No, you won't get an error.
Patrick Massot (Oct 13 2023 at 22:30):
You can simply try:
structure A :=
(x : nat)
structure B extends A :=
(y : nat)
def h := ({ x := 1, y := 2 } : B)
#check h.x
Patrick Massot (Oct 13 2023 at 22:31):
Direct access to a structure field is only the simplest use of dot notation in Lean.
Shreyas Srinivas (Oct 13 2023 at 22:31):
Thanks that helps
Eric Wieser (Oct 13 2023 at 22:43):
Shreyas Srinivas said:
Taking this even further, wouldn't it be convenient if it was in fact
{x := 1, y := 2}
rather than just delaborating to it?
Under the RFC at lean4#2666, this behavior can be recovered with
structure A where
x : Nat
structure B extends @[flat] A where
y : Nat
which means {x := 1, y := 2]
is notation for .mk 1 2
as opposed to .mk (.mk 1) 2
Eric Wieser (Oct 13 2023 at 22:46):
(If you like that approach, I encourage you or anyone else reading to :+1: the RFC, as supposedly this has some impact on prioritization)
Last updated: Dec 20 2023 at 11:08 UTC