まつもと ゆきひろです

In message "[ruby-dev:8530] Enumerable and rand"
    on 99/12/05, Koretsugu Daigoro <tmmcross / hk.airnet.ne.jp> writes:

|>   僕としては Collection モジュールを作る、というのが嬉しいぞ。
|> # Collection って前に話出ましたっけ?
|
|ほかでも名前があがっていますが正確にはどんなものなのでしょう?
|最初に書いたとおり私は Enumerable/Set/Collection の区別ができていません。

Enumerableは「数え上げられる」という意味です。要求しているの
は each メソッドだけで、かならずしも要素数が有限である必要は
ないのですが、Enumerableモジュールは要素数が有限であることを
期待しているメソッドがいくつもあります。しかし、これは
Enumerableが「要素数が有限であることを要求している」のではな
く、このようなメソッドがあった方が実用上便利であるというのが
理由です。

Collectionという話は以前に出たことはないと思いますが、[]で任
意の順序の要素にアクセスできる Indexable というモジュールに
ついて話題になったことはあります。

|統一的な意味づけとして「ランダムに(一つ)選ぶ」を提案します。

うーん、これは「rand」という名前の意味を、ですか?

私としては「rand(10)」と「obj.rand」は区別したいと思っている
のですが。さらに、特別な理由がない限り、この両方の形式を同じ
名前で提供したくたいとも。

|rand(10) が rand(0..10) でも rand(1..10) でも
|rand((0.0)..(10.0)) でもなく、rand(0..9) なのはなぜでしょう?
|(引数「未満」の「整数」を返すのはなぜか?)
|推測ですが、これは配列等が意識されていると思います。
|つまりすでに要素という概念と結びついているのではないでしょうか。

これはUNIXのrand(3)がそうだからという以上の理由はありません。
rand(3)の意図としてそういうものがある可能性はありえますよね。
それは認めますが、「すでに要素という概念と結びついている」可
能性があるといって

|だとすると、
|rand(n) を「0 から n-1 の範囲の乱数を発生する」と読むより、
|「n 個の中からランダムに一つ選ぶ」と読むほうが自然です。(強引?)

ここまでは極端だと思います。

|また、仮に rand(Range) あるいは Range#rand を許すとすると、
|Range よりもう少し広いクラスで定義できそうです。
|なぜなら Range には順序がありますが、
|rand にとっては順序は意味がないからです。
|つまり rand([0, 1, 2, 3]) も rand([2, 0, 3, 1]) も意味は同じです。

ここまでは同意できないことはないのですが。

|で、「もう少し広いクラス」として私は Enumerable をあげているわけです。

Enumerableは

  * 順序があるかないか
  * 繰り返せるかどうか(eachが再現性があるか)
  * 有限かどうか

のいずれにも制約がありませんから(最後のはちょっと制約してる
かな)、randの対象には広すぎるんじゃないかなあ。特に真中のが
ちょっとなあ。

|> んなことはないですよ。Enumerableってのは「順に要素が取り出せ
|> る」という意味しか無いんですから。
|
|Enumerable はもっと厳しい制限だと思います。
|本来は "Iteratable" とでも言うべきものだったのかもしれませんが、
|実情は Set (より正確には finite set?)であると思います。

私の意識だと「順に要素が取り出せるだけ」の方が「Finite Set」
よりも厳しい制限なのですが。each を複数回呼んで再現性がある
という保証もありませんし。

|可算集合(countable set)、たとえば「素数の集合」オブジェクトは
|要素を順に取り出せるという意味では Enumerable です。
|(prime_number.each{|n| ... } とできますよね?)
|が、 Enumerable の半分ぐらいのメソッドは意味がありません。
|(each_with_index{}, find{}, grep(){}, member?{}, index() 以外はだめ?)
|
|こういった理由もあって、私は Enumerable と FiniteSet を同一視していますが、
|これは間違いで、独立な概念なのでしょうか。

間違いとまでは言えませんが、設計者はFiniteを必須と考えている
わけではないですね。

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