Scala の SortedMap[A,B] を使っていると、許可されていない奇妙さに遭遇しました。SortedMap[A,B] "a" への参照が Map[A,B] 型であると宣言すると、"a" に対するマップ操作によって、ソートされていないマップの実装が生成されます。
例:
import scala.collection.immutable._
object Test extends App {
val a: Map[String, String] = SortedMap[String, String]("a" -> "s", "b" -> "t", "c" -> "u", "d" -> "v", "e" -> "w", "f" -> "x")
println(a.getClass+": "+a)
val b = a map {x => x} // identity
println(b.getClass+": "+b)
}
上記の出力は次のとおりです。
class scala.collection.immutable.TreeMap: Map(a -> s, b -> t, c -> u, d -> v, e -> w, f -> x)
class scala.collection.immutable.HashMap$ HashTrieMap: Map(e -> w, f -> x, a -> s, b -> t, c -> u, d -> v)
恒等変換の前後のキーと値のペアの順序は同じではありません。
奇妙なことに、「a」から型宣言を削除すると、この問題が解消されます。これはおもちゃの例では問題ありませんが、SortedMap[A,B] を Map[A,B] パラメーターを期待するメソッドに渡すために使用できなくなります。
一般に、「マップ」や「フィルター」などの高次関数は、それらが適用されるコレクションの基本的なプロパティを変更しないと予想されます。
「マップ」がこのように動作する理由を知っている人はいますか?