Zulip Chat Archive
Stream: new members
Topic: Why Lean don't allow to call this instance method?
Luis Enrique Muñoz Martín (Jul 24 2024 at 22:08):
The following code works as expected:
structure Foo
class Bar (α : Type) where
bar (a : α) : String
instance : Bar Foo where
bar a := "bar"
def callBar (f : Foo) : String := Bar.bar f --Works!
Nevertheless, if I add an extra type to Bar class, I no longer can call callBar:
structure Foo
class Bar (α β : Type) where -- <- Add β here
bar (a : α) : String
instance : Bar Foo Unit where -- We implement for the case of Unit
bar a := "bar"
def callBar (f : Foo) : String := Bar.bar f --No longer works
Nevertheless, by my understanding the compiler should know that Foo implements Bar, and β is implemented using Unit, so it should find the correct instance and let me call bar (?)
Kyle Miller (Jul 24 2024 at 23:31):
The reason is that typeclass inference is not willing to decide to solve for class parameters from the others unless you mark them as outParam. If you mark it as outParam, then you are promising that the rest of the non-outParam class parameters determine this one.
Kyle Miller (Jul 24 2024 at 23:31):
class Bar (α : Type) (β : outParam Type) where
bar (a : α) : String
instance : Bar Foo Unit where
bar a := "bar"
Luis Enrique Muñoz Martín (Jul 25 2024 at 11:38):
Just to the point, thanks @Kyle Miller
Shreyas Srinivas (Jul 25 2024 at 12:07):
@Kyle Miller : Is there a discussion of outParams in any of the basic books? There are lots of these small features which could do with a tutorial but only experts and maintainers seem to know about them
Luis Enrique Muñoz Martín (Jul 25 2024 at 12:20):
I read about this in the Functional Programming in Lean book, but I was not able to recognize the situation later when I was in front of it: https://lean-lang.org/functional_programming_in_lean/type-classes/out-params.html?highlight=outParam#output-parameters
Kyle Miller (Jul 25 2024 at 17:31):
@Shreyas Srinivas Not what you're asking, but the reference manual has a mention: https://lean-lang.org/lean4/doc/typeclass.html?highlight=outparam#output-parameters
Last updated: May 02 2025 at 03:31 UTC