Zulip Chat Archive
Stream: general
Topic: Providing implicit arguments to a function field
Lime Sublime (Jan 21 2021 at 00:09):
Suppose I have code like
universe l
structure Thing : Type (l + 1) :=
(Obj : Type l)
(Arr : Obj → Obj → Type l)
(id : ∀ {a} , Arr a a)
variables (A B : Thing) (f : A.Obj -> B.Obj)
def foo : ∀ a, B.Arr (f a) (f a)
:= λ a, let bid := B.id in @bid (f a)
I would like to avoid the let binding, but Lean complains at both @B.id
and B.@id
. Is there anything I can do?
Yakov Pechersky (Jan 21 2021 at 00:14):
def foo : ∀ a, B.Arr (f a) (f a)
:= λ a, Thing.id _
Lime Sublime (Jan 21 2021 at 00:16):
EDIT: This was wrong, sorry (I get a "too many arguments" error message when trying that)
Reid Barton (Jan 21 2021 at 00:18):
I don't understand why B.id
doesn't work, something weird about implicit argument insertion and dot notation? sounds vaguely familiar...
Yakov Pechersky (Jan 21 2021 at 00:22):
Does this not work for you @Lime Sublime ?
universe l
structure Thing : Type (l + 1) :=
(Obj : Type l)
(Arr : Obj → Obj → Type l)
(id : ∀ {a} , Arr a a)
variables (A B : Thing) (f : A.Obj -> B.Obj)
def foo : ∀ a, B.Arr (f a) (f a)
:= λ a, Thing.id _
#check foo A B f
Lime Sublime (Jan 21 2021 at 00:33):
That code works for me! Unfortunately, the solution produces an error in a larger section of code. Trying to build a repro now
Reid Barton (Jan 21 2021 at 00:34):
If you need to give an explicit argument for some reason then another option is @Thing.id B (f a)
Lime Sublime (Jan 21 2021 at 00:36):
In fact it does work, @Yakov Pechersky ! Thanks! How did you generate the fix?
Yakov Pechersky (Jan 21 2021 at 00:37):
I took Reid's suggestion from earlier for the notation to just use the structure's field instead of relying on projection notation
Floris van Doorn (Jan 21 2021 at 05:06):
Yeah, you cannot combine the @
with the projection notation (dot notation), so in that case you have to just write the full name of the projection.
Last updated: Dec 20 2023 at 11:08 UTC