Zulip Chat Archive

Stream: new members

Topic: has_add

Quinn Culver (Apr 08 2023 at 17:23):

Why is my attempt at a has_add instance below failing? The error message at has_add is

type mismatch at application
  has_add f.corge
has type
  baz P L f  Type u : Type (u+1)
but is expected to have type
  Type ? : Type (?+1)

MWE attempt:

universe u

variables {P L : Type u}

variables (P L)

inductive foo (P L: Type u)
| points (p : P) : foo
| lines  (l: L) : foo

namespace foo
def bar : Π (x y : foo P L), foo P L
| (points p) (lines l)  :=  sorry
| (points p) (points q) := sorry
| (lines l) (lines m) := sorry
| (lines l) (points p) := sorry

structure baz (f : foo P L) :=
(a b : P)

variables {P L}
def corge (f : foo P L) (my_baz : baz P L f): Type* := {x : P // bar P L (points x)  (points my_baz.a) = bar P L (points my_baz.a) (points my_baz.b) }

instance foo_baz_corge_add (f : foo P L) (my_baz: baz P L f) : has_add (f.corge) := sorry

end foo

Adam Topaz (Apr 08 2023 at 17:28):

Because has_add X needs X to be a type, and as the error says, f.corge is a function which takes a term of baz … and returns a type.

Adam Topaz (Apr 08 2023 at 17:29):

You probably want has_add (f.forge my_baz) (untested)

Eric Wieser (Apr 08 2023 at 19:05):

@Quinn Culver, this seems to be tripping you up over and over again. If you're unsure how to build an expression without errors, you can use #check to slowly assemble it piece by piece to see what's going on.

Eric Wieser (Apr 08 2023 at 19:07):

Here, that looks like

variables (f : foo P L) (my_baz: baz P L f)

#check f.corge -- reading the type suggests we meant...
#check f.corge my_baz

Last updated: Dec 20 2023 at 11:08 UTC