2012-02-07 8 views
13

は私が見てきたセットのマップ機能に設定を渡すためにどういう意味私が行うことができますスカラ:結果得</p> <pre><code>Set(1, 2, 3).map(Set(1)) </code></pre> <p>:

Set(true, false) 

をしかし、私は思いましたmap関数は新しいSetではなく、別の関数しか取ることができません。何かがあれば、私はこれが一連のセットを返すと期待しています。何が起こっているのか、その結果はどういう意味ですか?

答えて

18

をしかし、私はmap機能だけで他の関数ではない新しいSetを取ることができることを考えた:Scaladocに継承セクションを参照してください。

Setは、です。要素からブール値への関数です。要素を渡すと、その要素がSetの一部であるかどうかがわかります。 Set(1)にそれぞれ各要素を通過Set(1, 2, 3)

Set(1, 2, 3).map(Set(1)) 

反復し、。私。最初に「1がセット{1}のメンバー」であることを尋ねると、それはという同じ質問を23と入力します。これはfalseです。

したがって、結果はSet(true, false, false)で、もちろんSet(true, false)です。

同様に、シーケンスは整数から要素までの関数であり、マップはキーから値までの関数です。

5
  • Set[A]延べFunction1[A, Boolean]
  • Map[K, V] PartialFunction[K, V]Function1[K, V]が続きます。
  • Seq[A]PartialFunction[Int, A] Function1[Int, A]が続きます。

したがって、Scalaコレクションライブラリでは、セット、シーケンス、マップ自体が関数です。

  • applySet[_]のメンバーシップをテストします。
  • applyメソッドMap[_, _] は、指定されたキーに関連付けられた値を返します。 キーが存在しない場合はエラーが発生します。
  • applyメソッドSeq[_]は、指定されたインデックスの要素を返します。無効なインデックスのエラーをスローします。

以下の二つは等価です:

Set(1, 2, 3).map(Set(1)) 

Set(1, 2, 3).map(x => Set(1).contains(x)) 

は、したがって、次の2つです。また、

Seq(1, 2, 3).collect(someMap) 

Seq(1, 2, 3) collect { 
    case x if someMap contains x => someMap(x) 
} 

そして、2次

Seq(1, 2, 3).map(someSeq) 

Seq(1, 2, 3).map(x => someSeq(x))