Scala中无点样式的情况

时间:2011-07-25 07:38:54

标签: scala functional-programming pointfree

对于这里的FP认知来说,这似乎是显而易见的,但Scala中的点自由风格有什么用呢?在这个主题上真正卖给我的是一个插图,展示了点自由风格在某些方面(例如,性能,优雅,可扩展性,可维护性)如何在非点自由风格中解决相同问题的代码。

4 个答案:

答案 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)

...但当然,无点样式的读取更自然(加号似乎是一个运算符)。