1

リスト状態のドキュメント:

結果のコレクションのタイプは、リストの静的タイプによって決まります。これにより、予期しない結果が生じる場合があります。例えば:

// lettersOf は Set の代わりに、繰り返される可能性が高い文字の Seq[Char] を返します def lettersOf(words: Seq[String]) = words flatMap (word => word.toSet)

// lettersOf は、Seq ではなく Set[Char] を返します def lettersOf(words: Seq[String]) = words.toSet flatMap (word => word.toSeq)

私はこれを理解するのに苦労しています。StringOps.toSet は Char の Set を返すため、最初の例は最終的に Char Seq を返します - 結構です。それは理にかなっている。私が従わないのは、なぜ 2 番目の例で Scala が Seq ではなく Set を構築するのかということです。

ここで「結果のコレクションは静的なタイプのリストによって導かれる」とはどういう意味ですか?

4

1 に答える 1

1

Set クラスでcanBuildFromメソッドが定義されているためです。ScalaDoc のCanBuildFromトレイトでわかるように、次の3 つの型パラメーターCanBuildFrom[-From, -Elem, +To]があります。

From - ビルダーの作成を要求する基になるコレクションの型。
Elem - 作成されるコレクションの要素タイプ。
To - 作成するコレクションのタイプ。

基本的に、セットで flatMap 関数を呼び出すと、暗黙的に呼び出さSet.canBuildFrom[Char]れ、Set[Char]

静的タイプについて。Scala がコレクションの型を変換しようとするとき、コレクションCanBuildFromの静的な型に依存するこのトレイトを使用します。

コメントを更新しました

-Xprint:typer を scala コマンドに追加すると、typer フェーズの後に Scala コンパイラが flatMap メソッドで使用される暗黙的なメソッド Set.canBuildFrom[Char] を解決する方法を確認できます。

def lettersOf(words: Seq[String]): scala.collection.immutable.Set[Char] = words.toSet[String].flatMap[Char, scala.collection.immutable.Set[Char]](((word: String) => scala.this.Predef.augmentString(word).toSeq))(immutable.this.Set.canBuildFrom[Char])
于 2013-05-22T19:58:20.887 に答える