15

私は新しい Scala IDE (Eclipse 3.6.2 + Scala IDE 2.0.0 [Scala 2.9.0]) で遊んでいて、次のような簡単なことをしようとしました:

(1 to 10).sum

それはうまくいきますが、私は最近も多くのGroovyを行っており、自動的に次のように書きました:

(1 to 10).sum()

この 2 番目のバージョンでは、IDE でコンパイラ エラーが発生し、次のメッセージが表示されます。

メソッド sum: (implicit num: Numeric[B])B の引数が不十分です。指定されていない値パラメーター番号。

Scala API を見ると、sum には 2 つのバージョンがあり、1 つはパラメーターをとらず、もう 1 つは上記の暗黙的なパラメーターを取ります。かっこなしで引数なしのメソッドを呼び出す必要がありますか?

4

2 に答える 2

28

答えは、パラメータ リストを指定する(つまり、括弧を使用する) 場合、そののパラメータ (または、より正確には、デフォルトのないもの) を指定する必要があるということです。

パラメーターが である空でないパラメーター リストで括弧を省略した場合implicit、コンパイラはそれらを挿入できます (最初の例のように、スコープ内で関連する暗黙的なものを明白に見つけることができると仮定します)。

1 to 10 sum

パラメータを自分で渡したい場合 (この例ではその必要はありません)、Predef.implicitly基本的に明確なスコープ内の暗黙的な値を返すものを利用できます (存在すると仮定します)。ここでの使用は次のとおりです。

(1 to 10).sum(implicitly[Numeric[Int]])
(1 to 10).sum[Int](implicitly)

これは、複数の暗黙的なパラメーターを受け取るメソッドで特に重要です。そのうちの 1 つだけをオーバーライドしたい場合があります (その後implicitly、他のパラメーターに使用できます)。たとえば、scalaz では

aFoldable.sum(implicitly, myMonoid) //uses implicit Foldable but bespoke monoid

scaladocの ユースケースに関するご質問は; これは、暗黙のパラメーター リストを使用して (そうしないと混乱を招く可能性がある) メソッドを使用する方法を示す幻のエントリです。この scaladoc エントリの存在は、この悪名高い質問にたどることができます。

于 2011-04-04T22:42:36.807 に答える
3

バージョンは 1 つだけです。API をよく見ると、括弧のないエントリの先頭に「[ユース ケース]」と書かれています。これは、理解しやすくするための API ドキュメントの合成重複エントリです。ユース ケース エントリは、基本的に、いくつかの一般的なシナリオの完全なエントリを減らしたものです。この質問の詳細: Scaladoc [ユースケース]

2 番目の呼び出し (...sum()) が失敗する理由は、引数は暗黙的ですが、既定値がないためです。デフォルト値が指定されている場合のみ、括弧内の引数を省略できます。これは非論理的に聞こえますが、暗黙の引数の扱いは異なります。明示的に指定してから括弧を使用するか、(暗黙の引数がスコープ内にあるため)それらを省略しますが、括弧も削除する必要があります。これは、読みやすさを向上させるためのものです。

def test(fun: Int => Int)(implicit s: String)

今、あなたは書くことができますがtest { i => i }test(i => i)()どちらが厄介ですか。

于 2011-04-04T22:44:16.267 に答える