Scala中是否有一些点的规则?

时间:2016-12-26 21:30:30

标签: scala

正确的例子:

"Hello".foldLeft(1L)((a, b) => a * b)

REPL打印错误:

"Hello" foldLeft(1L)((a, b) => a * b)

如何解释?有一些规则吗?我认为在Scala中跳过点是很好的,但有些例子不起作用。

  

错误:长(1L)不接受参数" Hello" foldLeft(1L)((a,b)   => a * b)

2 个答案:

答案 0 :(得分:1)

您可以使用Arix-1(单个参数)的方法使用“中缀表示法”。惯例是将这些用于纯功能方法。使用像foldLeft这样的curried函数(多个参数列表),你只能对第一个参数列表使用中缀表示法(这会令人困惑,你可能不想这样做。)

相关:

What are the precise rules for when you can omit parenthesis, dots, braces, = (functions), etc.?

文档:

http://docs.scala-lang.org/style/method-invocation

使用curried函数:

Curried method call by infix notation

答案 1 :(得分:1)

foldLeft是一个curried函数,curry函数不能直观地与infix(无点)表示法一起使用。你需要在括号中包装中缀调用,如下所示:

scala> ("Hello" foldLeft 1L)((a, b) => a * b)
res0: Long = 9415087488

在这种情况下,我建议不要使用这种用法。

对于某些一般规则,您可以查看here