ポリモルフィズムのレベル

ポリモルフィズムなし →普通の関数 例:C言語
1つの引数(self)の型に応じてポリモルフィズム →普通のオブジェクト指向のメソッド 例:Smalltalk
全ての引数の型に応じてポリモルフィズム ジェネリックファンクション 例:CLOS等
さらに戻り値の型にも応じてポリモルフィズム →いまここ 例:Scala

って感じ?

Island Life - 静的型がうらやましいとき
「戻り値の型によって多相化できる」っていうのは静的型の 強力なところ

http://blog.practical-scheme.net/shiro/20100508a-static-or-dynamic

Togetter - まとめ「型付けについてのまつもとさんとみずしまさんのやりとり」
RubyのmapがHashを返せたとして、{}.map{|e| e[0]} と {}.map{|e| [e[1],e[0]} だとどうなります?Procを実際に適用してみることができないので、とりあえずArray返すくらいしか選択肢ないですよね。
引数として渡される関数(Rubyだとブロック)の型情報に基づいて、どの種類のコレクション(RubyならArrayかMapか)を返すか、を変えたい、ということです。

http://togetter.com/li/19536

JavaRubyを2番目の例に入れようと思ったけど、なんか拡張機能があるらしいのでやめておいた。

多重ディスパッチ - Wikipedia
一般的なオブジェクト指向言語での単一ディスパッチでは、メソッド呼び出し(Smalltalkなら「メッセージ送信」、C++なら「メンバ関数呼び出し」)を行ったとき、その引数の1つが特別に扱われ、呼び出すべきメソッドの特定に使われる。多くの言語では、この特別な引数は構文上も特別な指定をされる。例えば、その特別な引数を最初に記して、その後にドットを挟んで呼び出すべきメソッドの名前を記述する(例えば special.meth(other,args,here))。
多重ディスパッチを採用する言語では、全ての引数がメソッド選択という観点では平等に扱われる。第一引数、第二引数、第三引数とマッチングを行うが、どれか特定の引数がその関数やメソッドを「所有」しているわけではない。
初期の多重ディスパッチを採用した例として Common Lisp Object System がある。

何らかの拡張でマルチメソッドをサポートする言語として、次のものがある。
* Scheme (TinyCLOS)
* Python (gnosis.magic.multimethods)
* Perl (Class:Multimethods)
* Java (MultiJava)
* Ruby (The Multiple Dispatch Library, Multimethod Package)

http://ja.wikipedia.org/wiki/%E5%A4%9A%E9%87%8D%E3%83%87%E3%82%A3%E3%82%B9%E3%83%91%E3%83%83%E3%83%81