質問

以下のコードを見ました:

Map(1 -> "one", 2 -> "two") map _._1

これは反復可能な[int]を返しますが、マップで何もしたくない場合、それを行う方法は?

以下のようなことをしたいのですが、以下のコードはコンパイルできません。それは機能ではなく、機能を作成する方法であるため、私は知っています x => x そして、プレースホルダーを使用してください:

Map(1 -> "one") map (_)  // map (Int, String) to (Int, String) by nothing change
// I test some other way, but all can't compile

これを行う方法?

更新しました

情熱的な人を混乱させてすみません。理由を知りたい map (_) != map (x => x), 、コンパイラこのコードをに変換します (x$1) => Map(1.$minus$greater("one")).map(x$1) なぜだめですか Map('a'.$minus$greater(1)).map((x$1) => x$1), 、そして、使用できる方法がありますか _ このコードを作成しますか?

以下のコードを使用して、コンパイラが推測しました _ タイプ:

Map(1 -> "one") map (_:((Int, String))=>(Int, String))
// but it return (((Int, String)) => (Int, String)) => scala.collection.immutable.Map[Int,String] = <function1>

パーサーは、匿名関数の始まりをどこに置くかわからなかったようです。それで、私の新しい質問は、「パーサーが匿名関数の境界を制限するのを助ける方法?」です。

役に立ちましたか?

解決

私が質問を理解しているかどうかはわかりませんが、 identity 多分あなたが探しているものです:

scala> Map(1 -> "one") map (identity)
res66: scala.collection.mutable.Map[Int,java.lang.String] = Map((1,one))

または、いくつかのトリックを行います:

scala> def __[A](x: A): A = x
__: [A](x: A)A

scala> Map(1 -> "one") map (__)
res1: scala.collection.immutable.Map[Int,java.lang.String] = Map((1,one))

他のヒント

ダニエルの答えを見つけました、 Scalaの匿名関数とマップ 、この答えは、この場合のパーサープロセスプレースホルダーを明確にさせてください。全てに感謝。

ここでやろうとしていることには価値がありません。コレクションをそれ自体にマッピングする正しい方法は、マップを呼び出すことではありません!

間違い:

Map(1 -> "one") map (_)

右:

Map(1 -> "one")

浅いコピー操作でも有用ではありません。デフォルトのSCALAマップは不変であり、コピーする意味はありません。


  Map(1 -> "one") map((x)=>x)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top