[ruby-trunk - Feature #5513][Open] Numeric へ述語語の追加

Issue #5513 has been reported by tadayoshi funaba.


Feature #5513: Numeric へ述語語の追加

Author: tadayoshi funaba
Status: Open
Priority: Normal
Assignee:
Category:
Target version: 2.0

現在の Numeric では、その表現の特徴について問合せる基本的な語が不足して
おり、プログラミングにおいて総称性の確保が難しくなっています。いくつか
の述語を追加することで、未知への数値表現への備えが出来、協調して働く基
盤が整うと思われます。

具体的には以下の述語を追加する事を提案します。

Numeric#rational?、Numeric#complex?、Numeric#float?
Numeric#exact?、Numeric#inexact?
Numeric#finite?、Numeric#infinite?、Numeric#nan?
Numeric#positive?、Numeric#negative?

Ruby においては、クラス階層はほぼ実装の為の便宜的なものですが、実際には
プログラミングにおいて、それがどのクラスであるのかを手掛りにしている事
も多いです。しかし、それは正しいやり方になりません。例外的に、
Numeric#real? と Numeric#integer? は既に用意されています。

Ruby では、Scheme におけるような厳密数と非厳密数の区別がありません。こ
のため総称性の確保が困難になっています。その為、現在の Complex の実装な
ども真っ当なやり方とは言えない部分があります。

Ruby には既に Float#finite? などがありますが、実際には、BigDecimal を見
ればわかるように、これは Numeric にあるべきものだったと思います。

Numeric の中には負の零を表現できるものもあります。そういった区別も含め
て、正負を区別する必要がある場合もあるでしょうから、簡単に区別が出来る
ようなっている事は意味があると思います。

かつて数などはひとつだけあればいいのだ、と言った人もいましたが、それは
現実的でなく、実際に Ruby の数はそのようになっていません。そうではなく、
複数ある表現を使いわけてひとつの系としてうまく働くようにするしかないの
だろうから、その為には、このようなものが必要であると思います。

Issue #5513 has been updated by tadayoshi funaba.

Status changed from Open to Rejected
Assignee set to tadayoshi funaba


Feature #5513: Numeric へ述語語の追加

Author: tadayoshi funaba
Status: Rejected
Priority: Normal
Assignee: tadayoshi funaba
Category:
Target version: 2.0

現在の Numeric では、その表現の特徴について問合せる基本的な語が不足して
おり、プログラミングにおいて総称性の確保が難しくなっています。いくつか
の述語を追加することで、未知への数値表現への備えが出来、協調して働く基
盤が整うと思われます。

具体的には以下の述語を追加する事を提案します。

Numeric#rational?、Numeric#complex?、Numeric#float?
Numeric#exact?、Numeric#inexact?
Numeric#finite?、Numeric#infinite?、Numeric#nan?
Numeric#positive?、Numeric#negative?

Ruby においては、クラス階層はほぼ実装の為の便宜的なものですが、実際には
プログラミングにおいて、それがどのクラスであるのかを手掛りにしている事
も多いです。しかし、それは正しいやり方になりません。例外的に、
Numeric#real? と Numeric#integer? は既に用意されています。

Ruby では、Scheme におけるような厳密数と非厳密数の区別がありません。こ
のため総称性の確保が困難になっています。その為、現在の Complex の実装な
ども真っ当なやり方とは言えない部分があります。

Ruby には既に Float#finite? などがありますが、実際には、BigDecimal を見
ればわかるように、これは Numeric にあるべきものだったと思います。

Numeric の中には負の零を表現できるものもあります。そういった区別も含め
て、正負を区別する必要がある場合もあるでしょうから、簡単に区別が出来る
ようなっている事は意味があると思います。

かつて数などはひとつだけあればいいのだ、と言った人もいましたが、それは
現実的でなく、実際に Ruby の数はそのようになっていません。そうではなく、
複数ある表現を使いわけてひとつの系としてうまく働くようにするしかないの
だろうから、その為には、このようなものが必要であると思います。

Issue #5513 has been updated by Yukihiro M…

まつもと ゆきひろです

In message “Re: [ruby-dev:44708] [ruby-trunk - Feature #5513][Open]
Numeric へ述語語の追加”
on Sun, 30 Oct 2011 17:23:56 +0900, tadayoshi funaba
[email protected] writes:

|具体的には以下の述語を追加する事を提案します。

順序を変えてコメントします。

|Numeric#exact?、Numeric#inexact?

これは数全般が持つ性質を示しているので、導入に賛成します。
むらけんさんも提案しておられましたね。

|Numeric#rational?、Numeric#complex?、Numeric#float?

まあ、すでにinteger?などがあるのではすが、integerでない
(real)のものをさらにrational, floatと細かく分割するスタイルを
推奨することになるこれらの述語の導入は総称性と逆方向になるの
ではないですか?

complex? はスカラーでない点で特別扱いが必要そうな気がするので、
他の述語よりは必要性が高いのかもしれませんが、私には判断がつ
きません。

|Numeric#finite?、Numeric#infinite?、Numeric#nan?

現時点ではこれらの性質を持つ数クラスはFloat(と一部
BigDecimal)しかないのですが、総称製の確保という点ではNumeric
にあったほうが良いという理屈はわかります。

わかりますが、そもそもなぜBigDecimalにInfiniteがあるのかとう
点が納得できてなかったりしますし、一部の数クラスでしか意味が
ない性質が総称性という名のもとにNumericに次々追加される傾向に
違和感を感じるのも確かです。個人的な意見としては、反対とまで
は言わないが、賛成でもないくらいです。

|Numeric#positive?、Numeric#negative?

これは x > 0 とか x < 0 で判断されるべきではないでしょうか?
さらにいうと complex の存在により、positive? というのは
Numeric全体で判定できる性質ではないような気がしますので、賛
成しません。

「負の零」ついてですが、確か「正の零」に正規化してたように思
うのですが、仕様化はしてなかったような気もします。

全般的に「これらの述語をどのような局面で使うと嬉しい」という
点が具体的でないので(一部を除き)積極的に賛成する気になれませ
ん。個人的な意見としては、このリクエストはrejectして、いくつ
かのグループごとに別にして再検討してはどうだろうか思います。

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

Feature #5513: Numeric へ述語語の追加

Author: tadayoshi funaba
Status: Open
Priority: Normal
Assignee:
Category:
Target version: 2.0

現在の Numeric では、その表現の特徴について問合せる基本的な語が不足して
おり、プログラミングにおいて総称性の確保が難しくなっています。いくつか
の述語を追加することで、未知への数値表現への備えが出来、協調して働く基
盤が整うと思われます。

具体的には以下の述語を追加する事を提案します。

Numeric#rational?、Numeric#complex?、Numeric#float?
Numeric#exact?、Numeric#inexact?
Numeric#finite?、Numeric#infinite?、Numeric#nan?
Numeric#positive?、Numeric#negative?

Ruby においては、クラス階層はほぼ実装の為の便宜的なものですが、実際には
プログラミングにおいて、それがどのクラスであるのかを手掛りにしている事
も多いです。しかし、それは正しいやり方になりません。例外的に、
Numeric#real? と Numeric#integer? は既に用意されています。

Ruby では、Scheme におけるような厳密数と非厳密数の区別がありません。こ
のため総称性の確保が困難になっています。その為、現在の Complex の実装な
ども真っ当なやり方とは言えない部分があります。

Ruby には既に Float#finite? などがありますが、実際には、BigDecimal を見
ればわかるように、これは Numeric にあるべきものだったと思います。

Numeric の中には負の零を表現できるものもあります。そういった区別も含め
て、正負を区別する必要がある場合もあるでしょうから、簡単に区別が出来る
ようなっている事は意味があると思います。

かつて数などはひとつだけあればいいのだ、と言った人もいましたが、それは
現実的でなく、実際に Ruby の数はそのようになっていません。そうではなく、
複数ある表現を使いわけてひとつの系としてうまく働くようにするしかないの
だろうから、その為には、このようなものが必要であると思います。