Scala中的无点样式示例

Scala中的无点样式示例,scala,functional-programming,pointfree,Scala,Functional Programming,Pointfree,这对于FP专家来说似乎非常明显,但是Scala中的无点风格有什么好处呢?在这个主题上,我真正感兴趣的是一个例子,它展示了无点风格在某些方面(例如性能、优雅、可扩展性、可维护性)比用无点风格解决同一问题的代码要好得多。我认为除了“优雅”之外没有其他优势:它稍微短一点,而且可能更具可读性。它允许将函数作为实体进行推理,而无需从心理上深入到函数应用程序的“层次”,但当然,您需要首先习惯它 我不知道有哪一个例子可以通过使用它来提高性能(如果你最终得到一个函数,而一个方法就足够了,那么性能可能会变得更差)

这对于FP专家来说似乎非常明显,但是Scala中的无点风格有什么好处呢?在这个主题上,我真正感兴趣的是一个例子,它展示了无点风格在某些方面(例如性能、优雅、可扩展性、可维护性)比用无点风格解决同一问题的代码要好得多。

我认为除了“优雅”之外没有其他优势:它稍微短一点,而且可能更具可读性。它允许将函数作为实体进行推理,而无需从心理上深入到函数应用程序的“层次”,但当然,您需要首先习惯它


我不知道有哪一个例子可以通过使用它来提高性能(如果你最终得到一个函数,而一个方法就足够了,那么性能可能会变得更差)

一般来说,无点风格的一个优点是,如果没有一堆“点”(值而不是函数)四处浮动,这些“点”必须在多个地方重复以使它们通过计算,那么犯错误的机会就更少了,例如键入变量名时


然而,无点代码的优点在Scala中很快被其微弱的类型推断能力所抵消,无点代码加剧了这一事实,因为“点”是类型推断器的线索。在Haskell,几乎完全类型推断,这通常不是一个问题。

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

List("a","b","c") foreach println
在这种情况下,
foreach
希望接受
String=>Unit
,一个接受字符串并返回单元的函数(本质上,没有可用的返回,它完全通过副作用工作)

这里不需要将名称绑定到传递给
println
的每个字符串实例。可以说,这样做只会使代码更加冗长:

List("a","b","c") foreach {println(_)}
甚至

List("a","b","c") foreach {s => println(s)}

就我个人而言,当我看到不是以无点风格编写的代码时,我会将其视为一个指标,即绑定名称可能会被使用两次,或者它在记录代码时具有某种意义。同样,我将无点风格视为一种迹象,表明我可以更简单地对代码进行推理。

Scala的无点语法是真正的函数的神奇Scala运算符的一部分。即使是最基本的运算符也是函数:

例如:

val x = 1
val y = x + 1
…与…相同

val x = 1
val y = x.+(1)

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

我确实大体上看到了使用无点样式的好处,如您的示例所示,但可能我应该说我正在寻找一个“非琐碎”的说明。在你的例子中,非点自由风格只是稍微详细一点,我不足以说明点自由真的会产生巨大的影响。同样,这是有争议的,但好处只有在更复杂的例子中才会倍增。在许多情况下,消除括号/括号和下划线可以减少在读取一段代码时必须考虑嵌套的数量。当然,我也可以找到反例,对我来说真正重要的是,不为“点”添加名称是否会使其更具自我记录功能。无点编程不是通过将函数组合在一起而不是将它们绑定到对象来编程吗:
val squareList=map square
可以是一种表示形式,Scala支持这种表示吗。Haskell的一个例子如下:
listFn=map(negate.sum.tail)
这里提供了一个关于无点风格的解释@vamsiampolu我来这里也是想弄明白的,看起来你可以定义你自己的,但看起来scala社区还没有从这个很酷的辅助工具中喝到:
defmap[a,B]:(a=>B)=>Iterable[A]=>Iterable[B]=f=>list.map(f)def always[A,B]:A=>B=>A=x=>y=>x val dingoMap=map(always(“dingo”))dingoMap(list(1,2,3))/->list(“dingo”,“dingo”,“dingo”)
是的,无点样式将帮助您避免编码错误,例如使用错误的循环变量。OTOH,这样的错误通常不难发现。嗯,事实上,对于很多琐碎的例子来说,Scala并不是用于无点编程的最佳语言。在某个时候,类型推断器会唠叨您并要求您提供有关您想要使用的类型的确切事实,或者方法的隐式求值(然后您必须使用
\uu
将其转换为函数)使您怀疑结果是否真的可以称为“无点”,我不知道“无点”有一个不明显的含义。也许你可以解释一下“无点”是什么意思,以避免将来的混淆?简而言之,它意味着省略对函数参数的显式引用,或者只使用函数定义函数。在评论中有点难以解释。(/)感谢您的误解,因为这也是我的误解,我希望您能在对话中坚持下去,对话的目的是提供一些有用的链接。:-)