Since it hasn’t been mentioned: use <> for grouping types only when needed to put it into one parameter.
Option T
Option <Vec T>
HashMap String <Vec T>
Option <HashMap String int>
Typecheck would know how many type parameter each type constructor needs, and parsing should be fine(?)
Working(?) example:
fn find<'a, T>(key: &str, map: &'a HashMap String T) -> Option &'a T { .. }
cmr says commas need to stay for HashMap<String, HashMap<String, int>>, let’s try it:
HashMap String <HashMap String int>
Maybe this syntax will be very friendly for simple-ish types and when it’s complicated it gets very similar:
Foo<A<B<C,D>, E<F>>>
is
Foo <A <B C D> <E F>>