4

私は現在 Scala を学んでいます。左折はカリー化されているため、以下のように最初のパラメーターで部分的に適用された関数 (PAF) を取得できるはずです。

(0 /: List(1, 2, 3)) _

しかし、実際には、エラーがあります。

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

次に、以下のような右折で同じことを試しました

(List(1, 2, 3) :\ 0) _

このようにうまくいき、 ((Int, Int) => Int) => IntのようなPAFを得ることができました

foldLeft メソッドで PAF を取得できることはわかっていますが、「/:」で表現できるかどうかは疑問です。

4

2 に答える 2

3

アンダースコア構文は、複数のパラメーター リストを使用する右結合メソッドではうまく機能しません。ここに私が見るオプションがあります:

  1. 変数の型を宣言します。

    val x: ((Int, Int) => Int) => Int =  0 /: List(1, 2, 3)
    
  2. 同様に、タイプの帰属を使用します。

    val x = (0 /: List(1,2,3)) : ((Int, Int) => Int) => Int
    
  3. 後置表記を使用します。

    val x = List(1,2,3)./:(0) _
    
  4. foldLeft同義語を使用します。

    val x = List(1,2,3).foldLeft(0) _
    
于 2015-03-02T15:54:49.453 に答える
1

私はそれをいじってみましたが、機能する構成を見つけることができませんでした。

常により明示的なものがあります:

val f = List(1,2,3,4,5).foldLeft(0)_

これは間違いなくよりきれいです。それでもつついていきます。

編集:

これがあります:

val f2 = (0 /: List(1,2,3,4,5))(_: (Int,Int) => Int)
val x = f2(_+_)

しかし、それはかなり醜くなっています。型注釈がなければ、文句を言います。それが私ができる最善のことです。

于 2015-03-02T15:09:13.450 に答える