mmpy(A, B) = 
  BT = transpose(B),
  map((F) => map(F, BT), map(inner#1, A));

// inner#1 is curried version of inner

inner(U)(V) = inner(U, V);

// inner is inner product of two vectors (as lists)

inner(U, V) = inner(U, V, 0);

inner([], V, Acc) => Acc;
inner(U, [], Acc) => Acc;
inner([A | U], [B | V], Acc) => inner(U, V, A*B + Acc);


A = [[1,2],[3,4],[5,6]];
B = [[2,1,4,6],[1,3,2,5]];

test(mmpy(A, B), [[4, 7, 8, 16], [10, 15, 20, 38], [16, 23, 32, 60]]);



