立石です.

At Tue, 31 Jul 2001 15:02:15 +0900,
matz / ruby-lang.org (Yukihiro Matsumoto) wrote:
> いではないです。で、調べてみてちょっとショックだったのは
> (ruby-listでも書いたけど)多くのSchemeの処理系は5/2は2.5を返
> すんですよ。4/2は2だけど。exactnessについてきちんと書いてあ
> るR5RSを元にしててもそうなってるってのはすこしびっくり。

ML系の言語だとsml,mosmlでは `5 div 2 = 2' となり,
ocaml では `5 / 2 = 2' となります.

日常生活において,紙面上や頭の中で計算を行なう場合に,
少なくとも僕は,

5 / 2 = 2.5 (あるいは分数)

と書くことが多いです.しかし,計算機などで計算をする場
合には,

5 / 2 = 2

ということを自然に意識します.これは型があるというが頭の
片隅にあるからではないかとちょっと思っています.
Rubyには動的な型はあるので,この型の問題を考えて強引に論
理武装するというのはどうでしょうか?

現在の仕様では,

Integer / Integer = Integer
Float   / Float   = Float

ですが,Numeric < Integer < Float という順序をつけて組の
順序を
  (a1,b1) < (a2,b2) <==> (a1 < a2) and (b1 < b2)
ということにすれば,

# (a1 < a1)は成り立つものとします.

Numeric / Numeric = Numeric
Numeric / Integer = Numeric
Numeric / Float   = Numeric
Integer / Integer = Numeric
Float   / Float   = Float

Integer / Float   = Float  (or Numeric)
Float   / Integer = Float  (or Numeric)

ということで順序は保存できて奇麗になります.しかし,元の
  Numeric < Integer < Float
という順序関係がRubyのクラス階層とマッチしないのがちょっと…
という感じです.そこで,Rubyのクラス階層と同じように
  Numeric < Integer
  Numeric < Float
という半順序にすると,

Integer / Integer = Numeric
Integer / Float   = Float  (or Numeric)

において,Numeric < Float は成り立つのに,
  (Integer, Integer) < (Integer, Float)
が成り立たないのはちょっと嫌だなという気がしてきます.
つまり,5/2 = 2.5, 4/2 = 2, 4/2.0 = 2.0 の同居は嫌だな
ということです.そして,

Integer / Integer = Integer
Integer / Float   = Float

ならば,Integer,Floatは比べようがないので,(Integer,Integer)
と(Integer,Float)も比べられなくてもいいのではないかと…

上記のものには間違いや強引な点があると思いますが,こういう観
点からの論理武装はどうでしょうか?
-- 
Takaaki Tateishi <ttate / jaist.ac.jp>