4

我目前正在学习 Scala,我只是想知道 fold-left。由于 fold-left 是柯里化的,因此您应该能够获得具有以下第一个参数的部分应用函数 (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

然后我通过 fold-right 尝试了同样的事情,如下所示

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

这样,它就正确了,我可以得到一个 PAF,例如((Int, Int) => Int) => Int

我知道我可以通过使用 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 回答