Zulip Chat Archive
Stream: lean4
Topic: One-field structures in Lean code
Denis Gorbachev (Oct 04 2023 at 10:22):
There are some one-field structures in Lean code (see examples below). IIRC, creating an element of a new one-field structure is an unnecessary allocation. Is there a reason to do this, instead of just using the type of that field?
Examples:
structure FilePath where
  toString : String
structure MessageLog where
  msgs : PersistentArray Message := {}
structure String.Pos where
  byteIdx : Nat := 0
Could be just
def FilePath := String
def MessageLog := PersistentArray Message
def String.Pos := Nat
(default values could be provided by Zero instances)
Damiano Testa (Oct 04 2023 at 10:27):
docs#Polynomial is another example.  In this case, I think that one of the main motivation for cutting the DefEq was that there were continuous "leaks" and the implementation sometimes surfaced where it was undesirable.
Scott Morrison (Oct 04 2023 at 10:35):
The compiler is smart enough to optimize these away.
Shreyas Srinivas (Oct 04 2023 at 12:40):
Denis Gorbachev said:
There are some one-field structures in Lean code (see examples below). IIRC, creating an element of a new one-field structure is an unnecessary allocation. Is there a reason to do this, instead of just using the type of that field?
Examples:
structure FilePath where toString : String structure MessageLog where msgs : PersistentArray Message := {} structure String.Pos where byteIdx : Nat := 0Could be just
def FilePath := String def MessageLog := PersistentArray Message def String.Pos := Nat(default values could be provided by
Zeroinstances)
If you use them in proofs, I recommend using abbrev instead of def
Mac Malone (Oct 04 2023 at 14:51):
Denis Gorbachev said:
Is there a reason to do this, instead of just using the type of that field?
Yes, a structure wrapper prevents Lean from automatically coercing between the wrapper type and the wrapped type (i.e., using a Nat where a String.Pos is expected or vice versa works without error with a def but produces a type error with a structure wrapper).
Denis Gorbachev (Oct 04 2023 at 22:52):
Thank you for answers!
Last updated: May 02 2025 at 03:31 UTC