人们说Groovy势在必行,而Scala更像是一种功能语言。
但是Groovy支持高阶函数和不可变变量,所以从理论上讲,你可以在其中编写函数代码。
哪些特定功能使得在Scala中编写功能代码比在Groovy中更容易?
答案 0 :(得分:8)
您可以用C编写功能代码!如果作为一种函数式语言只是一个是/否的问题,唯一的要求就是#34;理论上你可以在其中编写功能代码"然后我能想到的几乎所有语言都是"功能性& #34;
要说清楚,我要说当我谈到函数式编程时,我主要考虑纯函数式编程。我知道有些人会反对这一点,并说使用来自功能世界的高阶函数,闭包等功能是更重要的标准,使用这些功能并使用副作用仍然是函数式编程。我认为高阶函数和闭包是命令式编程的极其有价值的补充,但我不考虑将它们添加到您的工具包中,以便将您转移到不同的类编程中,所以,如果我们要在" functional"之间做出重大区分。并且"没有功能"那么我认为将纯函数和命令式编程区分开来会更有用。
根据我的经验,真正归结为"态度"语言及其生态系统,而不是一组特定的技术特征。它是关于什么"正常"在一种语言中,因为最终会告知标准库的API设计以及您将要处理的所有其他第三方代码。
Scala在设计时非常注重功能性编程。即使没有阅读其设计者的相关语句,我们也可以在类字段等语言特性中看到它是不可变的,除非你特别要求它们是可变的,案例类和模式匹配使得不可变的普通旧数据结构易于使用,以及for-comprehensions专门用于让你在不使用变异的情况下编写循环代码(传统的for / while循环定义不能在没有至少局部副作用的情况下做任何有用的事情)。
但标准库更重要的是什么;因为他们希望你编写纯粹的功能代码,所以这些库被明确地设计为支持这一点:所有重要的基本不可变集合类型都存在(有可变版本,但是不可变版本是默认版本),通常只有大多数标准库需要的功能是通过程序员希望通过适合功能代码的接口来访问此功能的想法来实现的。整个软件包的设计考虑了功能性编程(当然,当你不想想要进行函数式编程时,它的设计也不会妨碍)。 / p>
Groovy我刚刚开始在工作中学习,但我最初的印象是它的功能水平"类似于Python(我已广泛使用)。它具有更高阶的函数和lambda,但是你与之交互的许多API主要是为了强制使用而设计的。它看起来比Python好一点,因为它有不可变集合 1 ,但可变性仍然是默认值,所以没有人会想到制作一个需要使用副作用。
如果您尝试使用某种语言(和图书馆生态系统)进行功能编程而不是为了满足这一需求,您会发现您必须时刻保持警惕。您有责任确定可用于纯代码的接口子集,填写您认为基本功能工具包(映射,折叠,选项类型等)的空白,包装纯接口围绕那些拒绝让你使用它们而没有变异等等的事情并没有那么难,但它是额外的概念工作量,它肯定减少了函数式编程的一些好处(其中主要是减少错误)。
我认为这是一种语言之间的差异,这种语言是真正的功能性的#34;而且只是"支持函数式编程&#34 ;;是否使函数式编程变得容易或困难。它本身就是与您交互的API的属性,而不是语言功能本身。
1 作为一个题外话,我发现一组基本的不可变集合对于支持函数式编程比不可变的变量更为重要。即便如此,它实际上并不是问题的不变性,它是允许您在不改变它们的情况下使用集合的API(如果集合 < / em>不可变的)。除非你像Haskell这样的语言在任何地方强制执行纯洁,否则它总是成为程序员纪律的问题,只是避免副作用。选择不分配给可变变量很容易;使用列表或地图而不改变它,当一个人在不可变列表或地图上的基本操作不存在时更是一种痛苦。