But if a reader see a keyword like “typeclass instance blah” and googles “Scala 3 typeclass” then it should be possible to describe what is being done fairly simply/concisely in say 1-2 pages of text (including examples of how they are defined and used). This is also what I would expect they would be able to do if they come across the “collective extension” syntax.
However, if the only keyword that the reader sees is “given blah” then there is perhaps 20-30 pages of non trivial documentation to wade through and properly understand. Maybe they will then figure out that this is meant to be a typeclass, perhaps not. I just think that it a lot harder to do, even for someone who is smart. The context bound is another curve ball to deal with and understand (or ignore, and hope that it isn’t really important).
Then they may see a method definition where there is some stuff in brackets before the method name (a bit weird), and probably be confused. Then they might think that it is just infix notation (okay - that sort of makes sense), but then in this case this isn’t infix notation because actually it is an extension method, and now the type variables also end up in a different place - they are no longer after the method name. I.e. the structure of the language has become far less regular, and I don’t see that as a good thing.
Perhaps the complexity of these concepts on their own is reasonable/acceptable, but when you put them together I think you end up with something really very complex. I used to know C++ but wouldn’t bother with it today, because the language is just too big and too complex. Similarly, for Rust, I think that it has some great ideas, but my impression is that the borrows checker adds too much unnecessary complexity - garbage collection is probably the better pragmatic choice. Languages like C, Java, Go are the other way round, the language is simple, but then the code ends up potentially being very verbose. But I would estimate that 90% of my professional colleagues would argue that a simpler language is good enough, and better than a complex one.
Scala 2.13 makes writing some code blissfully simple, but there is a underlying complexity that bubbles under the surface. When Martin announced Dotty & Scala 3, I had interpreted his goal of taking Scala 2, keeping the best bits, getting rid of [some] warts, simplifying some of the underlying mechanics, and hopefully allowing me to access some of the more advanced parts of the language that I had previously shied away from due to their complexity.
I think that for individuals who know Scala 2 very well, and have been working closely on the Scala 3 specification, and debating it for a long time, then what can seem obvious and intuitive is not necessarily the case for folks who are less familiar and haven’t been involved in the specification. Perhaps books and education will solve this gap, but my nagging feeling is that Scala 3 could benefit if there was a bit less (exposed) complexity.