5

言い換えれば、これがコンパイルされるべきではない正当な理由はありますか?

def f(xs: List[Int]) = xs.foldLeft(0) _  // OK
def f(xs: List[Int]) = (xs :\ 0) _       // OK
def f(xs: List[Int]) = (0 /: xs) _

<console>:15: error: missing arguments for method /: in trait TraversableOnce;
follow this method with `_' if you want to treat it as a partially applied function

以下にいくつかの回避策を示します。

def f(xs: List[Int]) = xs./:(0) _
def f(xs: List[Int]): ((Int, Int) => Int) => Int = (0 /: xs)

しかし、私の質問は主に一般的な適切な構文に関するものです。

4

2 に答える 2

2

たった今直したのですが、仕様の修正が必要なのでまだチェックインできません。

scala> def f(xs: List[Int]) = (0 /: xs) _
f: (xs: List[Int])(Int, Int) => Int => Int

scala> f(1 to 10 toList)
res0: (Int, Int) => Int => Int = <function1>

scala> res0(_ + _)
res1: Int = 55

問題は、op が { val x=e1; の右結合である場合、仕様が "e1 op e2" を定義していることです。https://issues.scala-lang.org/browse/SI-1980のように、より単純な e2.op(e1) がこの問題を解決するため、私には明らかではない理由があります。お問い合わせをさせていただきます。

于 2011-10-14T05:04:28.147 に答える
2

コンパイラのバグのようです。この式をさまざまなバージョンの scala でテストし、次のことを確認しました。

def f(xs: List[Int]) = (0 /: xs) _

と の場合は同じように動作し2.9.1.finalます2.8.2.finalが、2.7.7.final異なるエラー メッセージ ( Iterablevs. TraversableOnes) が表示されますが、古いバージョンでのコレクション ライブラリの再設計が原因だと思います。

def f(xs: List[Int]) = (0 /: xs) _
<console>:4: error: missing arguments for method /: in trait Iterable;
follow this method with `_' if you want to treat it as a partially applied function

コメントで言及した式は、異なる scala バージョンでは異なる動作をします。

def f(xs: List[Int]): (Int, Int) => Int => Int = (0 /: xs)

スカラ 2.9.1.final:

 found   : (Int, Int) => Int => Int
 required: (Int, Int) => Int => Int

本当に紛らわしいコンパイラ メッセージです。間違いなくバグです。

スカラ 2.8.2.final:

 found   : => ((Int, Int) => Int) => Int
 required: (Int, Int) => (Int) => Int

最初は奇妙=>ですが、2.7.7 と比較すると、最終結果は回帰のように見えます。

スカラ 2.7.7.final:

 found   : ((Int, Int) => Int) => Int
 required: (Int, Int) => (Int) => Int

found一見正しいように見えますが、コードはまだ機能していません。

scala bugtrackerで同様の問題を検索しましたが、適切なものが見つかりませんでした。チケットを作成するだけで十分だと思います (または 2 つ? この 2 つのエラーは関連していないようです)。

于 2011-10-12T16:10:59.227 に答える