From: gotoken@... (GOTO Kentaro) Date: 1999-02-10T03:43:20+09:00 Subject: [ruby-dev:4946] Re: man Precision ごとけんです 4時間席を外していたら議論がめっちゃ進んでる… (@_@) これが仕事ならどこぞの旅費で集まって直接討論するとこなんですが… In message "[ruby-dev:4930] Re: man Precision" on 99/02/09, 石塚圭樹 writes: >けいじゅ@日本ラショナルソフトウェアです. >>もちろん.ただし Matrix#prec と Precision#prec は >>利用者の簡便(?)のために名前を揃えることはよいとは思いますが, >>実装は全然違うはずで,下で確認するように仕様にしても引数に >>どのクラスをもってこれるかが違います. > >>> Matrix[[1,2],[2,3]].prec(Complex) > >>Complex{Rational} みたいにパラメータつきのクラスがあれば, >>完全に上の例は容認できます.さもなくば prec なのに実際の >>(各要素 real と image の)精度が不定になるので反対です. > >Complex自身精度を持っていないので良いのでは? つまり, 元々の精度が保持 >されているということで. > ># coerceの新しい案ではなくてはならないものなのでOKして欲しいような... # 最後の口説きの部分の意味がとれてないのですが(汗; # あ,[ruby-dev:4927] のことですか…複雑なのであとで返事します. つまり prec(Complex) という idiom はレシーバーが コンテナっぽい複合数値なら,その各要素の精度を 保持したままの Complex にするということですね. Matrix[[1,2i],[2.0,2/3+3.0i]].prec(Complex) #=> Matrix[[1+0i,0+2i],[2.0+0i,2/3+3.0i]] うーん,悩ましいな.Precision#prec は精度を確定させる ことに意味がありますが,この prec(Complex) は精度は 確定させないのですね.それならば Matrix に collect みたいな project でも用意して Matrix[[1,2i],[2.0,2/3+3.0i]].preject{|elem| elem.prec(Complex)} の方が筋が通っていると思うのですが,キツ過ぎる?? もちろん, Float みたいに「精度をもった」引数が来る Matrix#prec を用意することについては異論はありませんが, やはり, Precision#prec ではないので, Precision を Matrix がインクルードすることは認めたくないですし, これは Complex についてもそう思います. >>> Integer <-> Float <-> Rational <- Complex <- Matrix >>> |---- 精度を持つクラス ------| >>> >>>精度を持つクラスといわれている部分はお互いに変換可能ですが, そうでない >>>クラスは, その構成要素となりうるものが何であるかによって変わわってくる >>>と. >> >>そうです.そのお互いの変換可能というのが Precision のココロです. > >えーと, ここからが文脈がよくとれないのですが, Precisionモジュールをイ >ンクルードできるのは, 精度を持つクラスに限らなくても良いって意味でしょ >うか? いいえ,違います.上で Integer <-> Float <-> Rational |---- 精度を持つクラス ------| とかかれた部分だけに Precision をインクルードすることを 許すという意味です. >>そのために,例外を起こすだけの Precision#induced_from を >>定義してたりします.つまり,Precision#prec をもつなら >>induced_from を再定義し実装せよ,即ち「< Precision」を >>名乗る以上は他のクラスからの変換要求に応えよ,ということです. > >純粋抽象(仮想)関数なわけですね. ># そういえば, Rubyにはそういうものがないなあ... そうですね.でも僕は仮想関数ってあんまりよく知らないんで 恩恵が分からないんですけど (^^;; >>>coerceと同じく, precとinduced_fromでそのタイプが変換して良いか悪いか判 >>>断するようにしたらいががでしょう? >> >>うえのココロを受け入れてもらえるなら >> >>module Precision >> def prec(klass) >> raise klass < Precision 訂正: ^^^^^^^^^^^^^^^^^^^^^^^ raise unless klass < Precision >> klass.induced_from(self) >> end >>end > >>としますが,いかがですか?? > >うーん. お互いに話しが噛みあっているのかどうか不安なんですが... 先に確 >認した前提でのお話と思って良いのでしょうか?? というわけで再度確認なんですが, Precision をインクルードすることは上のように 相互に交換可能なものに限るという前提のもとで Precision#prec に raise unless klass < Precision という 判断部分を加えるのはいかがですか?? -- gotoken