Scala中无点样式的情况

enh*_*ull 22 functional-programming scala pointfree

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

Kev*_*ght 22

很简单,它是关于能够避免指定不需要的名称,考虑一个简单的例子:

List("a","b","c") foreach println
Run Code Online (Sandbox Code Playgroud)

在这种情况下,foreach正在寻求接受String => Unit,一个接受String并返回Unit的函数(基本上,没有可用的返回,它纯粹通过副作用工作)

这里没有必要将名称绑定到传递给的每个String实例println.可以说,它只是让代码更加冗长:

List("a","b","c") foreach {println(_)}
Run Code Online (Sandbox Code Playgroud)

甚至

List("a","b","c") foreach {s => println(s)}
Run Code Online (Sandbox Code Playgroud)

就个人而言,当我看到没有以无点样式编写的代码时,我将其视为可以使用两次绑定名称的指示符,或者它在记录代码时具有一定的意义.同样,我认为无点样式是我可以更简单地推理代码的标志.

  • Pointfree 编程不是通过将函数组合在一起而不是将它们绑定到对象来进行编程:“val squareList = map square”可以是一种表示形式,Scala 是否支持这种表示形式。Learn you a Haskell 中的一个示例如下:`listFn = map (negate . sum . tail)` (2认同)

Tom*_*ett 5

一般无点样式的一个吸引力是,如果没有一堆"点"(值与函数相对)浮动,必须在几个地方重复以通过计算进行处理,制造错误的机会就会减少,例如,在键入变量名称时.

然而,Scala中由于其推断类型的能力微弱而迅速抵消了无点的优势,这一事实由无点代码加剧,因为"点"作为类型推理器的线索.在Haskell中,通过几乎完整的类型推理,这通常不是问题.