Excellent question and I thought about this a lot. I personally like how Python did it: it has lists, dicts, sets in the language itself. It doesn’t have arrays, since it wasn’t initially meant for numerical computing, but NumPy filled that need. So for Fortran, it makes perfect sense to me to have arrays, lists (like std::vector), dicts, sets in the language itself.
So where do you stop? Roughly at this level, which happens to be where Python also stopped. For anything else you need to create your own data structures.
A related question might be: what algorithms should compilers use for dicts? I would say you leave it unspecified, but compilers can provide multiple implementations, but as C++ and Python shows, it’s not a problem in practice: people will use it, and it will be fast enough, and if you have specific needs, then you provide your own custom implementation tailored for your specific use case. For example based on our preliminary benchmarking, the LFortran’s dict implementation was faster on many benchmarks than Clang’s default C++ std::unordered_map. I can imagine selecting different implementations using compiler options, or possibly even using some syntax in the source code when declaring the dict.