Zulip Chat Archive
Stream: lean4
Topic: parens on method LHS
Reid Barton (Jan 28 2021 at 14:26):
Is it intended that this program compiles?
class C (α : Type) where
op : α → α → α
instance : C Nat where
op (a b) := a + b -- should be `op a b := a + b`
Sebastian Ullrich (Jan 28 2021 at 14:26):
I think so, it's no different from def op (a b) := a + b
Reid Barton (Jan 28 2021 at 14:27):
It can lead to bewildering error messages if one tries to write something like
inductive X
| mk : Nat → X
instance : C X where
op (X.mk a) (X.mk b) := X.mk (a + b) -- function of 4 variables?
Sebastian Ullrich (Jan 28 2021 at 14:27):
That is, it's a group of binders without type
Reid Barton (Jan 28 2021 at 14:28):
hmm, I see
Reid Barton (Jan 28 2021 at 14:28):
I'm not very good at predicting what Lean 4 will understand yet
Kevin Buzzard (Jan 28 2021 at 14:28):
I don't see! How does op (a b)
even parse?
Reid Barton (Jan 28 2021 at 14:29):
Well this whole where ...
construction is new
Sebastian Ullrich (Jan 28 2021 at 14:31):
Think of it as def op (a b : _)
, aka def op (a : _) (b : _)
Sebastian Ullrich (Jan 28 2021 at 14:41):
@Reid Barton I think the rule here is that op
is a signature and we do not support direct pattern matching in signatures. But certainly we shouldn't accept X.mk
as a binder name. If it had errored with "expected atomic identifier", do you think that would have led you to the right path?
Reid Barton (Jan 28 2021 at 14:41):
That should probably be an error in any case, yeah
Reid Barton (Jan 28 2021 at 14:41):
I didn't really expect putting a pattern there to work, but then I got confused when it sort-of worked instead
Mario Carneiro (Jan 28 2021 at 15:01):
Why can't patterns go there? That's how it would work in haskell
Mario Carneiro (Jan 28 2021 at 15:01):
how do you write an equation compiler definition in a where
clause?
Sebastian Ullrich (Jan 28 2021 at 15:04):
It's a signature, so name binders | equations
Mario Carneiro (Jan 28 2021 at 15:07):
So:
inductive X
| mk : Nat → X
instance : C X where
op : X -> X -> X
| (X.mk a) (X.mk b) := X.mk (a + b)
?
Mario Carneiro (Jan 28 2021 at 15:07):
or are there supposed to be commas now
Mario Carneiro (Jan 28 2021 at 15:08):
Is the type ascription optional?
Sebastian Ullrich (Jan 28 2021 at 17:16):
Yes to both
instance : C X where
op
| X.mk a, X.mk b => X.mk (a + b)
Last updated: Dec 20 2023 at 11:08 UTC