2016-05-27 4 views
0

使用してScalaのアイデンティティコールを理解することはできませんよ。私はPredef識別機能をいじり先物とこの表現になった先物

identity(_: Future[A]) 

これはFuture[A] => Future[A]を返しますが、私はちょうどFuture[A]

を期待していたがアイデンティティメソッドはちょうど正確に_: Future[A]を意味するのだろうかと思うので、入力を返します。

+0

は、あなたがこの方法を自分で書いたり、ソースからこれをしました:

P.Sは:あなたは次のように同じことを行っているだろうか? –

答えて

1

identityある

identity((x: Future[A]) => x) 

identity(_: Future[A]) 

が拡大:あなたはちょうどので、パラメータの種類(渡された関数のではなく、アイデンティティ)を指定しています以下のようになります。

def identity[A](x: A): A = x 

ご覧のとおり、それは私ですthod。あなたは、次のような何か書くとき:

val f = identity(_: Future[Int]) 

をあなたはタイプFuture[Int] => Future[Int]の関数に、identityの方法を変革しています。 _: Future[Int]の部分はタイプ帰属と呼ばれ、AidentityのタイプがFuture[Int]であることをコンパイラーに通知します。

メソッドを関数に変換するプロセスは、η拡張の名前になります。

val f = identity[Future[Int]] _ 
+0

ええ、私はそれをしばらく再生した後に答えを実現しました。また、最後に示した例は確かに示しています。私が正しいとすれば、引数を渡すことなく、識別関数をカリングしますが、パラメータ化された型がFutureであることを指示していますか? –

+0

あなたはカールしていません。その方法では、メソッドを関数に変換するためにη拡張を使用しています。 – lambdista

1

この場合、_: Future[A]は、Future[A]という1つのパラメータを取り、それを返す関数を表しています。 List(1,2).map(_.toString)にマッピングするパラメータはx => x.toStringに展開、または単一のパラメータを取る関数、およびそれにtoStringを呼び出す方法と同様に

あなたのケースでは、あなたはそれに関するメソッドを呼び出すことはありません。定義されてPredefでFuture[A] => Future[A]

+0

いいえ、 '(x:Future [A])=> identity(x)'に展開されます。 –