HasShape generator traits are defined as follows
HasLength()if there is a fixed, finite length.
HasShape()if there is a known length plus a notion of multidimensional shape (as for an array).
This suggests that any method that can accept a
HasLength generator should be able to deal with a
HasShape one as well. However since these traits make a flat hierarchy, a method defined as
f(::HasLength, iter) = ..
would not accept e.g. an array.