array-curry returns an immutable array, whose elements, which are themselves arrays, are computed anew each time they are accessed.
If passed as arguments to (array-outer-product op A B) and if all the elements of the result of array-outer-product are then accessed, then each element of A is accessed (array-volume B) times, and each element of B is accessed (array-volume A) times. In this situation, passing the results of array-curry as arguments to array-outer-product results in some inefficiency.
So we use array-copy to convert the result of array-curry to a specialized array before passing to array-outer-product in the matrix-multiply and inner-product examples, which are the same, really, because
(equal (matrix-multiply A B) (array-inner-product A + * B)) => #t
https://github.com/scheme-requests-for-implementation/srfi-179/pull/17