JavaのLongAccumulatorとMonoid

1
Kenji Yoshida @xuwei_k

Java8のLongAccumulatorのコンストラクタに渡すやつって、つまりMonoid則満たせってことです?微妙に違う?

2016-04-05 21:09:37
Noriyuki OHKAWA @notogawa

@xuwei_k 可換モノイドじゃないです?

2016-04-05 21:29:54
がくぞ @gakuzzzz

@xuwei_k Monoid則満たさなくても意図してる挙動になるならなんでも良さそうですね。identityが単位元じゃなくて単なる初期値でも良さそうですし。

2016-04-05 21:44:40
Kenji Yoshida @xuwei_k

話の流れがなんか微妙だけど "what are sometimes called abelian monoids, rather than ordinary monoids" mail.openjdk.java.net/pipermail/lamb… という発言を否定してない(?)し、可換モノイドっぽい?

2016-04-05 21:44:53
Kenji Yoshida @xuwei_k

"このクラスはNumberを拡張しますが、equals、hashCode、compareToなどのメソッドを定義しません" docs.oracle.com/javase/jp/8/do… ていうJavadoc、(他でもたまにこういうのあるけど)Javaの色んな破綻を表してて趣深いよな・・・

2016-04-05 21:48:31
Kenji Yoshida @xuwei_k

@gakuzzzz そんな気もしてくるけどイマイチ自信がないので、MonoidじゃないけどLongAccumulatorで使える演算の具体例お願いします(?)

2016-04-05 21:50:29
がくぞ @gakuzzzz

@xuwei_k Long::max と 0 で 0以下の値は無視して最大値取る、みたいなのは許容されそう

2016-04-05 21:51:55
がくぞ @gakuzzzz

2項演算については順番が保証されないから可換則みたさないとだめっぽい気がするなー

2016-04-05 21:54:49
がくぞ @gakuzzzz

結合則は満たす必要あるのか?

2016-04-05 21:56:13
Kenji Yoshida @xuwei_k

@gakuzzzz それって、これとかこれと同じ(?)で github.com/scalaz/scalaz/… github.com/scalaz/scalaz/… なんか実質Monoidでは・・・?

2016-04-05 21:56:23
がくぞ @gakuzzzz

@xuwei_k でも単位元の性質は満たさないですよね?

2016-04-05 21:57:31
がくぞ @gakuzzzz

二項演算は可換半群である必要あるっぽい?

2016-04-05 22:00:16
Kenji Yoshida @xuwei_k

@gakuzzzz んー、0以下の値同士を足した場合がどういう定義になるのか?による気がする?

2016-04-05 22:01:07
がくぞ @gakuzzzz

@xuwei_k それ発生しうるんですかね? 複数の計算の順番は不定だけど、現在値と更新値での計算という別の制約が存在してるように思えます

2016-04-05 22:03:28
Kenji Yoshida @xuwei_k

@gakuzzzz 型的にはLongだから渡せるから、そもそも0以下の値を使う側が渡してきたら規約違反でもうなんかどうなってもいいのか、渡されたら無視しつつ継続したいのか、みたいなところの想定が?

2016-04-05 22:05:53
がくぞ @gakuzzzz

@xuwei_k 利用者としては0以下は無視して欲しいので、初期値に0を指定して可換半群だけどモノイドではない引数で初期化した、という想定ですね。

2016-04-05 22:08:11
がくぞ @gakuzzzz

@xuwei_k JavaDoc の「関数は、現在の値を第1引数とし、指定された更新値を第2引数として適用されます」の表記に依存した処理を書いていいのか悪いのかって所ですね。これに依存するとまずそうなら可換モノイドにした方がよさそう

2016-04-05 22:09:03
Kenji Yoshida @xuwei_k

@gakuzzzz 0以下(0含む)同士の演算結果を0で定義して、単位元0にすればMonoid則満たす・・・?

2016-04-05 22:12:27
がくぞ @gakuzzzz

@xuwei_k a + e の結果が e になっちゃって a に一致しないので 単位元則 を満たしてないような?

2016-04-05 22:16:55
Kenji Yoshida @xuwei_k

@gakuzzzz あー、じゃあSemigroupということか・・・? Long.MinValueを単位元にすれば満たせる(?)けど、かといってその用途を否定する理由にはならない・・・? (なんかまだあまり自分の中で整理できてない)

2016-04-05 22:20:55
がくぞ @gakuzzzz

@xuwei_k 可換半群を満たしてる必要はありそうですね(もちろんモノイドなら全く問題ない)

2016-04-05 22:23:49
ると @cocoa_ruto

これって値を累積しようとしたときに他のスレッドが更新中だったら新しいアキュムレータを内部で作るってことだろうけど、そのときに新しいアキュムレータを一旦初期値で初期化してから累積するのか、それとも累積しようとした値で直接初期化するのか twitter.com/xuwei_k/status…

2016-04-05 23:11:22
Kenji Yoshida @xuwei_k

「JavaのLongAccumulatorとMonoid」をトゥギャりました。 togetter.com/li/959053

2016-04-05 22:24:56
ると @cocoa_ruto

それが定められていないし、コンストラクタにはidentity elementと書かれているのでやはり本当に単位元でないとだめなんでないだろうか。

2016-04-05 23:15:13