These are chat archives for scalajp/functional

4th
Apr 2015
kenji yoshida
@xuwei-k
Apr 04 2015 04:46
メルセンヌツイスタをimmutableに単純に実装すると、1つのInt値生成するのに数KBの状態を毎回生成して持たないといけなくて、だいぶメモリ消費するな・・・。STArrayとか何かで工夫すれば改善するかもしれないけど、どうするのがベストだろうか・・・
Kota Mizushima
@kmizu
Apr 04 2015 06:11
メルセンヌツイスタ自体をimmutableに実装することにこだわらなければいいのでは?要は乱数生成側からmutableな状態見えなければいいわけですし。
kenji yoshida
@xuwei-k
Apr 04 2015 08:35
FunctionのArbitraryを実装する都合上、本当にランダムではなく、なんらかの形で予測可能というか同じseed渡したら同じ値が返ってきて欲しくて、それを実現するには、とりあえず乱数生成器側をimmutableにしてしまうほうが単純になる(?)という都合が。なにかもっと工夫のやりようはある気はしてるけれど
まぁでも、全く実用不可能なほどには遅くなさそうだし、速さより精度(いい感じに一様に?生成される)ことのほうが大事な場合もありえるから、一旦これでもいい気がしてきてる
あと、そもそもメルセンヌツイスタ自体に種類がある(?)みたいで、よくわかってないという問題も・・・
Sanshiro Yoshida
@halcat0x15a
Apr 04 2015 17:05
汎用traitってなにかデメリットありますか?
(50バイトくらい小さくなる
kenji yoshida
@xuwei-k
Apr 04 2015 17:09
50バイトw
すぐには思いつかないけど、なにかあったっけ・・・
Sanshiro Yoshida
@halcat0x15a
Apr 04 2015 17:10
Scalaz結構traitあるし小さくなるのでは???
kenji yoshida
@xuwei-k
Apr 04 2015 17:10
いや、50byteじゃ流石に微妙すぎる・・・
それより、 trait Functor[F[_]] はそのままに private[scalaz] abstract class FunctorImpl[F[_]] extends Functor[F]
を作って、 FunctorImpl を使える場合はそっちを使う、とかやるとたぶん小さくなるけど
小さくするためだけにこれも微妙なので、やってない
Scala標準ライブラリが、こういうの https://github.com/scala/scala/blob/v2.11.6/src/library/scala/collection/Iterator.scala#L1202 作って利用してるのと同じ原理で、
traitを積み重ねるより、abstract classで済むなら、abstract class用意しておいて、それ利用すると小さくなるという豆知識
Sanshiro Yoshida
@halcat0x15a
Apr 04 2015 17:14
/** Explicit instantiation of the `Iterator` trait to reduce class file size in subclasses. */
標準でもやってるのかー
Sanshiro Yoshida
@halcat0x15a
Apr 04 2015 17:21
特にデメリットないならextends Anyで書いていっちゃおうかな。
kenji yoshida
@xuwei-k
Apr 04 2015 17:22
とりあえず「どう考えてもサブクラスをvalue classにしなそうなのに、なんで extends Anyしてるんだ?」って、コード読む人が一瞬戸惑う、というデメリットはあるか
kenji yoshida
@xuwei-k
Apr 04 2015 18:47
STArrayと同じ方法でメルセンヌツイスタのmutable版をラップしてみたけど、scalaz標準のSTはそもそもスタックオーバーフローするし、独自にトランポリン版ST作ってみても、どちらにしろ別にimmutable版より速くならなくてつらい・・・