Scala:是否可以从leftfold获得部分应用的功能?

时间:2015-03-02 14:42:49

标签: scala partialfunction foldleft

我正在学习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) _

通过这种方式,它正确运行,我可以得到一个PAF,如((Int,Int)=&gt; Int)=&gt; INT

我知道我可以通过使用foldLeft方法获得PAF,但我想知道是否可以用'/:'来表达它。

2 个答案:

答案 0 :(得分: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) _
    

答案 1 :(得分: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(_+_)

但那变得非常丑陋。没有类型注释,它会抱怨。这是我能做的最好的事情。