Zulip Chat Archive
Stream: general
Topic: type class inference after colon
Kevin Buzzard (Mar 11 2018 at 18:34):
In example (α : Type) [comm_ring α] : ∀ x y z : α, x*(y+z)=x*y+x*z := mul_add
, type class inference enables us to use mul_add
. Is it possible to move the colon to the left of the alpha though? Not that I need to, it's just an idle question. If I try example : ∀ (α : Type) [comm_ring α], ∀ x y z : α, x*(y+z)=x*y+x*z := mul_add
then Lean complains about not being able to find has_add alpha
etc.
Kevin Buzzard (Mar 11 2018 at 18:37):
A related question: is there ever a difference between [comm_ring alpha]
and [H : comm_ring alpha]
in terms of the type class inference system? Or between [comm_ring alpha]
and [_inst_1 : comm_ring alpha]
?
Kevin Buzzard (Mar 11 2018 at 18:47):
And another type class subtlety. With
structure foo (α : Type) := (bar : α) (baz : α → α) #check @foo.bar #check @foo.baz
both foo.bar
and foo.baz
are Π {α : Type},...
. But if I change the structure to a class, foo.bar
(but not foo.baz
) magically changes to Π (α : Type)...
(no longer implicit). It didn't have to be that way, right? That is presumably some design decision?
Mario Carneiro (Mar 11 2018 at 19:36):
The first issue is #1920. You have to write example : ∀ (α : Type) [comm_ring α], ∀ x y z : α, by exactI x*(y+z)=x*y+x*z
if you want to use any typeclass args right of the colon
Kevin Buzzard (Mar 11 2018 at 19:37):
Aah -- this is exactly the change that caused you so much trouble!
Mario Carneiro (Mar 11 2018 at 19:39):
The second issue is just the usual analysis of when to make arguments implicit. It's a design decision, of course, but it is reasonably predictable and well motivated
Last updated: Dec 20 2023 at 11:08 UTC