Zulip Chat Archive
Stream: general
Topic: fun with coe_fn
Kenny Lau (Aug 03 2020 at 13:34):
universe u
structure fun_wrapper (A : Type u) : Type u :=
(to_fun : A → A)
instance fun_wrapper.has_one (A : Type*) : has_one (fun_wrapper A) := ⟨⟨id⟩⟩
instance fun_wrapper.has_coe_to_fun (A : Type*) : has_coe_to_fun (fun_wrapper A) :=
⟨_, fun_wrapper.to_fun⟩
theorem foo : ((1 : fun_wrapper ℕ) : unit → empty) = id := rfl
Kenny Lau (Aug 03 2020 at 13:34):
question: what's the type of id in the statement of foo?
Kenny Lau (Aug 03 2020 at 13:37):
@Mario Carneiro how does type ascription work?
Patrick Massot (Aug 03 2020 at 13:47):
Kenny, the new widget interface answers your question about foo
Patrick Massot (Aug 03 2020 at 13:47):
id is natural number id
Mario Carneiro (Aug 03 2020 at 14:01):
That is pretty interesting. I haven't run the code yet, but I assume it typechecks, and my guess is the following:
(1 : fun_wrapper ℕ)has the expected meaning, the wrapper around@id ℕ- Because this has type
fun_wrapper ℕdoes not have the typeunit -> emptyor unify with it, lean inserts acoe_fninto the term - Now the resulting term
coe_fn (@has_one.one (fun_wrapper ℕ) ...) = idis typechecked, finishing up the remaining holes in the term aroundcoe_fnandid. - Importantly, the type ascription
: unit -> emptyis now gone, because it has no representation as an expr. We only have a few metavariables left to solve in an otherwise completeexpr - The
fun_wrapper.has_coe_to_funinstance is inserted, which means that the result type isℕ -> ℕ, so the rhs is inferred to be@id ℕ, and we are done.
Mario Carneiro (Aug 03 2020 at 14:05):
Note the difference with coe : A -> B, where the output has type B, so a type ascription will cause @coe ?A ?B ... to solve the ?B metavariable. In coe_fn there is no metavariable B, it is a delayed unification of the form has_coe_fo_fun.F ?C ?x =?= B, which doesn't help to solve for ?C. I guess lean forgot about this unification constraint when it decided to insert the coe_fn in the term
Last updated: May 02 2025 at 03:31 UTC