具体哪些特性使Scala成为比Groovy更"实用"的语言?

gab*_*x01 3 groovy functional-programming scala

人们说Groovy势在必行,而Scala更像是一种功能语言.

但是Groovy支持高阶函数和不可变变量,所以从理论上讲,你可以在其中编写函数代码.

哪些特定功能使得在Scala中编写功能代码比在Groovy中更容易?

Ben*_*Ben 8

你可以用C编写功能代码!如果作为一种函数式语言只是一个是/否的问题,唯一的要求是"理论上你可以在其中编写功能代码",那么我能想到的几乎所有语言都是"功能性的".

为了清楚起见,我要说的是,当我谈到函数式编程时,我主要考虑的是函数式编程.我知道有些人会反对这一点,并说使用来自功能世界的高阶函数,闭包等功能是更重要的标准,使用这些功能并使用副作用仍然是函数式编程.我认为高阶函数和闭包是命令式编程的极其有价值的补充,但是我不考虑将它们添加到你的工具包中,以便将你转移到不同类型的编程中,所以如果我们要有一个"功能性"和"无功能性"之间的巨大区别我认为将纯功能性和命令式编程区分开来更有用.

根据我的经验,它真正归结为语言及其生态系统的"态度",而不是一组特定的技术特征.这是关于什么考虑的语言"正常",因为这是结束了通知的标准库的API设计和所有你要处理与其他第三方代码.

Scala在设计时非常注重功能性编程.即使没有阅读其设计者的相关语句,我们也可以在类字段等语言特性中看到它是不可变的,除非你特别要求它们是可变的,案例类和模式匹配使得不可变的普通旧数据结构易于使用,以及for-comprehensions专门用于让你在不使用变异的情况下编写循环代码(传统的/ while循环定义在没有至少局部副作用的情况下无法做任何有用的事情).

但更重要的是标准库; 因为他们希望你编写纯函数代码,所以库是明确设计的,以支持这一点:所有重要的基本不可变集合类型都存在(有可变版本,但不可变版本是默认版本),通常只是大多数实现标准库所需的功能,其理念是程序员希望通过适合功能代码的接口来访问此功能.整个软件包的设计充分考虑了函数式编程(当然,它的设计也是为了在您不想进行函数式编程时妨碍).

Groovy的我刚刚开始在工作中学习,但我的初步印象是,它的"functionalness"的水平是类似的Python(我已经广泛使用).它具有更高阶的函数和lambda,但是你与之交互的许多API主要是为了强制使用而设计的.它看起来比Python好一点,因为它不可变集合1,但可变性仍然是默认值,所以没有人会想到制作一个需要使用副作用的界面.

如果您正试图在语言(和库生态系统)功能程序,它是不会为迎合这一点,你会发现,你必须时刻保持警惕这样做.您有责任确定可用于纯代码的接口子集,填写您认为基本功能工具包(映射,折叠,选项类型等)的空白,包装纯接口围绕那些拒绝让你使用它们而没有变异等等的东西.这并不是那么难,但它是额外的概念工作量,它肯定会减少函数式编程的一些好处(其中的错误减少主要).

这就是我认为是"真正有效"的语言与仅仅"支持函数式编程"的语言之间的区别; 是否使函数式编程变得容易或困难.它实际上更多的是与您交互的API的属性,而不是语言功能本身.


1作为一个题外话,我发现一组基本的不可变集合对于支持函数式编程比不可变变量更为重要.即便如此,实际上并不是问题的不变性,它是允许您在不改变它们的情况下使用集合的API(如果集合不可变的,则必然存在).除非你使用像Haskell这样的语言,在任何地方都要实行纯洁,否则一直是程序员纪律的问题,只是避免副作用.选择不分配给可变变量很容易; 使用列表或地图而不改变它,当一个人在不可变列表或地图上的基本操作不存在时更是痛苦.