A block within a resource could itself represent one of multiple data types: an object, a set, a list or a map, so iterating over those same types makes sense. A resource must be uniquely addressable with the for_each expression providing the index, and there is no unique key to associate with a collection of maps.
If you want an ordered series of resource instances, that is what count is used for. Most of the time however users do not actually want an ordered series of resource instances which can create a difficult situation to fix later on, so the types used in resource for_each also ensure that ordering is never implied.