2015-10-02 9 views
6

私は現在Functional Programming In ScalaScalaはVariadic関数でアスタリスクを強調していますか?

これは私がas.tail: _*: _*を省略すると、Scalaはas.tailがここSeq[A]あるので、理にかなっている型の不一致のために不平を言うList[A]

def apply[A](as: A*): List[A] = 
    if (as.isEmpty) Nil 
    else ::(as.head, apply(as.tail: _*)) 

applyの擬似実装であるが、以下のよ。

しかし、_*は正確にここで何をしますか?

編集::などのため

正しい用語シーケンスワイルドカード

答えて

7

: _*表記はちょうどあなたがメソッドに渡されたコレクション(進み、コレクションの要素を治療するためのScalaのコンパイラに指示されますvarargsメソッドに1つずつ渡されているかのように、引数の中で: _*)を返します。たとえば、あなたが

foo(1, 2, 3, 4) 
+0

興味深いを入力したかのように

def foo(x: Int*) = x.sum val xs = Seq(1, 2, 3, 4) 

その後、

foo(xs: _*) 

作品を持っている場合。だから私は、 '_ *'は別の複雑なアンダースコアルールではなく、**私が理解できなかった特別なコンストラクト**だと思うのは正しいですか?私は、_existential type_を除いて、型に注釈を付けるためにアンダースコアが使用される別の例にまだ遭遇していません。ありがとう –

+0

"シーケンス引数" http://www.scala-lang.org/files/archive/spec/2.11/06-expressions.html#function-applications –

+0

"パターンシーケンス"の "シーケンスワイルドカード"、http: //www.scala-lang.org/files/archive/spec/2.11/08-pattern-matching.html#pattern-sequences –

関連する問題