匿名関数の境界を制限する方法は?
-
29-09-2019 - |
質問
以下のコードを見ました:
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)