对于这里的FP认知来说,这似乎是显而易见的,但Scala中的点自由风格有什么用呢?在这个主题上真正卖给我的是一个插图,展示了点自由风格在某些方面(例如,性能,优雅,可扩展性,可维护性)如何在非点自由风格中解决相同问题的代码。
答案 0 :(得分:22)
很简单,它是关于能够避免指定一个不需要的名称,考虑一个简单的例子:
List("a","b","c") foreach println
在这种情况下,foreach
正在寻求接受String => Unit
,这是一个接受String并返回Unit的函数(基本上,没有可用的返回,它纯粹通过副作用工作)
此处不需要将名称绑定到传递给println
的每个String实例。可以说,它只是让代码更加冗长:
List("a","b","c") foreach {println(_)}
甚至
List("a","b","c") foreach {s => println(s)}
就个人而言,当我看到没有以无点样式编写的代码时,我将其视为绑定名称可能被使用两次的指示符,或者它在记录代码时具有一定的意义。同样,我认为无点样式是我可以更简单地推断代码的标志。
答案 1 :(得分:5)
一般来说,无点样式的一个吸引力在于,如果没有一堆“点”(值与函数相对)浮动,必须在几个地方重复以使它们通过计算,所以机会较少犯错误,例如键入变量名称时。
然而,Scala中由于其推断类型的微弱能力而迅速抵消了无点的优势,这一事实由无点代码加剧,因为“点”作为类型推理器的线索。在Haskell中,通过几乎完整的类型推理,这通常不是问题。
答案 2 :(得分:1)
我认为除了“优雅”之外别无其他优势:它有点短,可能更具可读性。它允许将函数推理为实体,而不会在精神上对功能应用程序进行“更深层次”,但当然您需要先熟悉它。
我不知道使用它可以提高性能的任何示例(如果在方法足够的情况下最终使用函数,情况可能会变得更糟)。
答案 3 :(得分:-5)
Scala的无点语法是神奇的Scala运算符的一部分 - 它们是真正的函数。即使是最基本的运算符也是函数:
例如:
val x = 1
val y = x + 1
...与...相同
val x = 1
val y = x.+(1)
...但当然,无点样式的读取更自然(加号似乎是一个运算符)。