我目前正在学习Scala,我只是想知道左边的折叠部分。由于左折叠是curried,您应该能够获得具有第一个参数的部分应用函数(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)=>Int)=>Int
我知道我可以通过使用foldLeft方法获得PAF,但我想知道是否可以用"/:"来表达。
下划线语法不能很好地与采用多个参数列表的正确关联方法配合使用。以下是我看到的选项:
-
声明变量类型:
val x: ((Int, Int) => Int) => Int = 0 /: List(1, 2, 3)
-
类似地,使用类型归属:
val x = (0 /: List(1,2,3)) : ((Int, Int) => Int) => Int
-
使用后缀表示法:
val x = List(1,2,3)./:(0) _
-
使用
foldLeft
同义词:val x = List(1,2,3).foldLeft(0) _
我试过它,但找不到一个有效的配置。
总有更明确的:
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(_+_)
但这越来越难看了。如果没有类型注释,它会抱怨。这是我能做的最好的事了。