ちょうど今私はmapValues
が見ることを学ぶことに驚いています。結果は次の例に示します。Scala:なぜmapValuesがビューを生成し、安定した選択肢がありますか?
case class thing(id: Int)
val rand = new java.util.Random
val distribution = Map(thing(0) -> 0.5, thing(1) -> 0.5)
val perturbed = distribution mapValues { _ + 0.1 * rand.nextGaussian }
val sumProbs = perturbed.map{_._2}.sum
val newDistribution = perturbed mapValues { _/sumProbs }
アイデアは、私はそれを再正規化し、いくつかのランダムに摂動さ分布を、持っているということです。このコードは、実際には元の意図で失敗します。mapValues
がview
を生成するので、perturbed
が使用されるときは常に_ + 0.1 * rand.nextGaussian
が再評価されます。
私は現在distribution map { case (s, p) => (s, p + 0.1 * rand.nextGaussian) }
のようなことをやっていますが、それは少し冗長です。だからこの質問の目的は:
- この事実を知らない人を思い出させます。
- なぜ彼らが
mapValues
出力view
を作る理由を見てください。 - コンクリートを生産する別の方法があるかどうか
Map
。 - このトラップを持つその他の一般的なコレクションメソッドはありますか。
ありがとうございます。
OMG私は 'mapValues'を使用する別の場所があります。これは時には遅く走る理由です。 – Kane
私もこれに噛まれました。 – ziggystar
今日も私はこの罠に足を踏み入れました。 –