My understanding is that since very early on, this has been defined to allow for a very simple definition of matrices in block form.
E.g. it is relatively common in linear algebra to express given matrices A, B, C, D of compatible sizes,
M = [A B;
C D]
Now we can define things like M' * M and get the expected results, where
M' == [A' C';
B' D']
On the other hand, I’m not sure this functionality has been fully followed through on in Base. For example, an extremely obvious use case is block-diagonal matrices using Diagonal, but transpose(::Diagonal) is not recursive!
I was actually hoping we could clear this up sometime in the next release cycle - do we want to more fully support block-diagonal matrices using nested arrays? Or is it, upon hindsight, better to rely on specific wrapper types (might be BlockArray, BlockMatrix, BlockVector) which present a “flattened” view of the matrix for which recursion is implied (and remove recursion from the standard definition)?