0
def first[A] :Tuple2[A,_] => A  = ( pair :Tuple2[A,_] ) => pair._1
val name = first( ("Anna", 23) )

「2行目を詳しく見ると、ここに表示されているのは、Tuple2 [String、Any] => String型の新しく作成された関数を返すメソッド呼び出しです(コンパイラが起動して、適用に必要な型を推測するため)式全体は通常のメソッド呼び出しのように見えますが、実際には(パラメーターなしのファクトリメソッドへの)メソッド呼び出しとそれに続く関数呼び出しです。"-これは上記のコードの説明です。

上記のプロセスの最初のステップ(関数オブジェクトを作成するプロセス)について推論することはできません。誰かが「人間のコンパイラ」プロシージャを明示的に書き出すことはできますか?

編集:2行目の完全に拡張されたロジックは次の2行である必要があると思います

val firstAsFunc= first[String]; 
val name = firstAsFunc(("Anna", 23))
4

4 に答える 4

3

それをさらに分解するかどうかはわかりません。これが私が考えることができることです-あなたがそれを手に入れることを願っています、または他の誰かが私より賢いと感じていることを願っています。

scala> val func = first[String] // method call
func: Tuple2[String, _] => String = <function1>

scala> val name = func( ("Anna", 23) )
name: String = Anna

上記の問題は、func実際にはゲッター(メソッド呼び出し自体)であるため、ほとんど何も変更していません。

編集

正式なパラメータの意味がわかりません。メソッドfirstには値パラメーターはなく、パラメーターを入力するだけです。値パラメーターを渡そうとすると、構文エラーになります。

于 2012-05-27T07:09:55.420 に答える
3

あなたが言う時

(pair: Tuple2[A,_]) => pair._1

コンパイラは、あなたが実際に言っていると判断します

new Function1[Tuple2[A,_], A] {
  def apply(pair: Tuple2[A,_]) = pair._1
}

つまり、このメソッドは、と呼ばれるメソッドを使用して(タイプの)first新しいオブジェクトを作成します。このメソッドは、と言うと透過的に呼び出されます。(あなたが書いた場合、あなたは同じことを得るでしょう。)Function1applyfirst(...)first.apply(...)

(注:Tuple2[A,_]それ自体は省略できます(A,_)。)

于 2012-05-27T11:29:29.547 に答える
1

私はあなたが質問しているプロセスのどのビットを理解しているのか100%確信していません-あなたは関数オブジェクト何であるかについて質問していますか?私はそれがそうであると仮定してその質問に答えます:-)

関数オブジェクトは、FunctionN(など)特性の1つから派生しFunction0Function1メソッドを実装するapplyオブジェクトです。したがって、例を書き直すことができます。

scala> def first[A]: Tuple2[A, _] => A = new Function1[Tuple2[A, _], A] { def apply(pair: Tuple2[A, _]) = pair._1 }
first: [A]=> Tuple2[A, _] => A

scala> val name = first( ("Anna", 23) )
name: java.lang.String = Anna

関数は実際には次のようにFunctionNのインスタンスであることがわかります。

scala> def foo(x: Int, y: Double): String = "x = "+ x.toString +", "+ y.toString
foo: (x: Int, y: Double)String

scala> (foo _).isInstanceOf[Function2[_, _, _]]
res1: Boolean = true
于 2012-05-27T08:54:04.213 に答える
0

2行目を詳しく見ると、ここに表示されているのは、新しく作成された型の関数を返すメソッド呼び出しです。Tuple2[String,Any] => String

この説明は間違っています。2行目は「新しく作成された関数を返す」ことはありません。Rex Kerrが説明しているように、この関数は1行目に作成されます。

[2行目の]式全体は通常のメソッド呼び出しのように見えますが、実際には(パラメーターなしのファクトリメソッドへの)メソッド呼び出しとそれに続く関数呼び出しです。

私はこれが真実だとは思わない。Function1オブジェクトは1行目ですでに作成されているため、非表示のファクトリメソッドは実行されていません。

私が最初に尋ねていた質問の1つは、メソッドの正式なパラメーターは何ですか。

ウィキペディア>パラメータ#コンピュータサイエンスを参照してください

于 2012-05-27T18:21:25.473 に答える