まつもと ゆきひろです

In message "[ruby-math:00597] Re: int / int -> ?"
    on 01/08/22, 石塚圭樹 <keiju / ishitsuka.com> writes:

|まず, floatなくすのは、rationalの件とは独立の問題でしょう.

じゃあ、[ruby-math:00555]はなに? 冗談?

|では、まつもとさんにもわかる言葉で...

お願いします。

|というのも、ポリモルフィズムと関係があります。つまり、現行では、数値関連
|のクラスの``/''演算子のうちint/int だけが違う振る舞いを持っていて、ポリ
|モルフィズムの嬉しさ半減、さらに悪いことには思ってもいない振る舞いをするっ
|てことです。

嬉しさが減るってのは分からないでもないです。実装者としてはト
レードオフが気になるわけで。その嬉しさを実現するために、どれ
だけのことをする必要があるかということを考えると、あまり簡単
にはyesとは言えないのです。

|つまり、本来であれば出来るはずのアルゴリズムの再利用性が半減しているわけ
|です。典型的な例が、Matrix#detの例でしょう。Matrix#detで使っているアルゴ
|リズムは、ある程度普遍的なもの、つまり、数値であれば適応可能なアルゴリズ
|ムになっています。ところが、int/int の振る舞いが除算でなくて整除になって
|いるので、intが入っているとちゃんと計算できなくなると。正木さんも同様な
|例を出してくれましたが、こういったものはいっぱいあるわけです。

たとえば、「数値であれば適用可能なアルゴリズム」という場合の
数値というのは、どういう数値なんでしょう。除算に対して閉じて
いる? だと、整数はもともとそういう数値ではないですよね。

Mathematicaのような言語であれば、観念上の「数」というものが
あり、たまたま実装上の都合で「整数」、「有理数」、「浮動小数
点数」になり、シームレスに振る舞う(つまり、コンパチブルなの
で区別不要)というモデルを提供するべく一所懸命努力するのは当
然だと思いますが、より「普通の」プログラミング言語(要するにC
なんだけど)の影響を強く受けたRubyで整数と浮動小数点数(と有理
数)の間に現状存在しないシームレスな関係を実現するべく、互換
性を犠牲にしてまで開発コストをかける必要があるかどうかは、正
直なところかなり疑問です。

|>空正規表現と区別がつかないんで // は導入できませんし、結局現
|>時点では他の整合を考えていないアイディアレベルという印象を持っ
|>てます。
|
|これは嘘でしょう? 区別できるはずです。演算子//とリテラル//は違ったコンテ
|キストで現れますし。区別の仕方は、演算子/と同じようにできるはず。

あ、これはそうかも。

|>整除をdivに、/を int/int->float にして、/ は mathn で
|>rationalにするってアイディアそのものはそんなに否定するもので
|>はないのですが、
|
|うーん. 何度も言っているようにこれは勘弁してください。
|
|(1/49)*49==1) => false
|
|になるのは勘弁(ref [ruby-math:00561])

ということは、Floatは鬼子なんですね。というか、現状のInteger
も十分に鬼子ですね。ということは、私には上記の「数値であれば」
も幻想に思えるのですが。そういう「数学的に正しくシームレスな
数値」はRubyのNumericとは独立に定義した方が良いんじゃないで
すかねえ。

                                まつもと ゆきひろ /:|)