Zulip Chat Archive

Stream: general

Topic: list notation


Jason Dagit (Aug 23 2018 at 17:46):

I saw this snippet in the tutorial in the "inductive types" section:

notation `[` l:(foldr `,` (h t, cons h t) nil) `]` := l

I'm used to functional programming (but still very new to lean) so I think I understand what the above is morally doing, but I'm really struggling to parse it and make sense of it beyond a high-level understanding. Is there a reference for understanding notation? Or even a one-off explanation of this case.

Some example questions I have: How does notation bring things into scope? What does : mean in the above context? The backticks appear where I would expect an argument to foldr to go, so I guess notation supports mixing of syntactic elements and the expression you're defining?

Simon Hudon (Aug 23 2018 at 17:49):

I don't believe such a reference exists. I should probably write one.

The back ticks are only for delimiting tokens. foldl and foldr are special keywords in the notation syntax. You can look at it as: v:(foldr _ (v v, e) e). I used v to denote bound variables and e as expressions. _ stands for tokens that you use to separate expressions in the list.

Simon Hudon (Aug 23 2018 at 17:56):

In (v0 v1, e), you can see it as a lambda abstraction that you are forced to use (you don't have a choice to use different functions). In this case v0 stands for the expression most recently parsed v1 is an accumulator. e should be the next value of the accumulator and, eventually, the final value of that accumulator will be bound to l (in your example)

Jason Dagit (Aug 23 2018 at 18:01):

Ah. Interesting. It didn't occur to me that it might be a special foldr.

Jason Dagit (Aug 23 2018 at 18:03):

Thanks for the explanation, I think that makes sense and answers all the questions I have right now.

Simon Hudon (Aug 23 2018 at 18:07):

Let me know if you need more. It might be useful if you find other information I could include in the documentation.


Last updated: Dec 20 2023 at 11:08 UTC