やはり乗算は可換でないと違和感があるようだ

http://d.hatena.ne.jp/piyo2-moko/20080515#1210858404より

#テキストの演算
#エラー×:print num*(name+"!")+"paf@"(左側にテキストが来るように)
name="moko"
num=3
name*num           # => "mokomokomoko"
num*name rescue $! # => #<TypeError: String can't be coerced into Fixnum>

(簡潔に、なおかつxmpfilter形式に変換した)

「文字列 * 整数」は文字列の繰り返しなのだが、「整数 * 文字列」はエラーになるという話。
文字列と整数の乗算が文字列の繰り返しになるのは、一見直感的な定義だ。
だけど、やはり乗算は可換であるのが当然だというのが日常の感覚だろう。だから、整数 * 文字列がエラーになるというのはちょっと違和感を覚える人がいるかも。

だけど、よーく考えてみると「a * b」というのは「a.*(b)」の省略形(syntax sugar)だ。つまり、bを引数にしてaの「*」メソッドを呼んでいるという意味。そう考えるとべつに「a.*(b)」が「b.*(a)」と等しい必要性なんてまったくない。なまじ「a * b」と書けてしまうから違和感を覚えるのだろう。ただ、そう書けることで計算式が通常の記法で書けるという利点がある。
そう、「*」は演算子の形をしているメソッドなのだ。

ちなみに非可換な乗算というのは、Rubyに限らない。たとえば行列の乗算は非可換だ。つまり、「X*Y != Y*X」だ。
さらに、Xがn×m行列で、Yがm×l行列(n != l)のとき、X*Yはできるが、Y*Xはエラーになる。Rubyで「文字列 * 整数」は可能だが、「整数 * 文字列」はエラーになるというのに似ている。
他の非可換な乗算は群論とかの大学数学で出てくる。

require 'matrix'
m = Matrix[[1,2,3],[4,5,6]]
n = Matrix[[7,8],[9,10],[11,12]]
m*n # => Matrix[[58, 64], [139, 154]]
n*m # => Matrix[[39, 54, 69], [49, 68, 87], [59, 82, 105]]

追記

うわっ、n×m行列とm×n行列についてしか考えてなかった><>< テラアホスorz

[2008/05/17]追記

行列については高2の数学の教科書・参考書を開いてみるとよい。