Zulip Chat Archive

Stream: new members

Topic: When to use and when not to use parenthesis?


Youngju Song (Jan 01 2025 at 01:50):

I found that variable keyword enforces parenthesis whereas axiom keyword enforces "not" to use parenthesis:

variable (a: Nat)
variable a: Nat -- does not type check
axiom (a: Nat) -- does not type check
axiom a: Nat

This looks like an intentional design, but I am not catching the intent.

Eric Wieser (Jan 01 2025 at 02:29):

axiom should be compared to def, not to variable

Niels Voss (Jan 01 2025 at 02:29):

This is because variable is intended to mimick the syntax of an individual parameter in a def, while axiom is intended to mimick the syntax of a def itself. So, in

def f (n : Nat) : Nat := sorry

the variable command uses the syntax of (n : Nat) while axiom uses the syntax of f ... : Nat.

Another way to see this is that it makes sense to have a variable become an implicit parameter like variable {a : Nat} or typeclass inferred parameter like variable [inst : Nonempty T], but it would not make sense to have something like axiom {c : Nat} because c is the identifier name.

Youngju Song (Jan 02 2025 at 16:08):

@Eric Wieser @Niels Voss Thank you for the explanation! That makes very much sense, and I like the design!

Kyle Miller (Jan 02 2025 at 21:43):

Terminology note: axiom (a: Nat) doesn't parse. If you see "unexpected token", then it neither type checks nor doesn't type check, because it is not syntactically meaningful.

Youngju Song (Jan 03 2025 at 16:22):

@Kyle Miller Right, thanks for pointing this out!


Last updated: May 02 2025 at 03:31 UTC