scala 函数式编程_作者的Scala复习和问答中的函数式编程

scala 函数式编程

作者说,Paul Chiusano和RúnarBjarnason 在Scala中编写函数式编程 “不是一本关于Scala的书,”而是对基于Scala的函数式编程的原则性介绍。 因此,这本书对Scala语法或语义不做过多的研究,而是通过基本的功能编程概念快速进入了更高级和抽象的概念。

本书的主要吸引力在于它试图通过一系列逐渐复杂,经过深思熟虑的练习来介绍高级甚至复杂的函数编程概念,以帮助读者更好地理解它们。

这本书包括我们的部分。

第一部分着重于函数式编程中使用的基本概念和技术,例如引用透明性,纯度,惰性,函数数据结构等。

本书的第二部分侧重于功能设计,并指导读者完成一些库的总体设计过程,这些库旨在解决诸如创建并行和异步任务,基于属性的测试和解析之类的问题。 作者没有展示他们的案例研究设计,而是展示了如何解决设计高度可组合和模块化的纯功能库的问题。 他们特别强调了代数设计的概念,并提出了一个强有力的想法,即可以由遵循特定定律的代数来描述API。 这样,通过简单地遵循这些规则进行正式的符号操作,就可以证明API的属性。

第三部分介绍了高级抽象,这些抽象允许推理代码,并且在设计库时功能非常强大。 这导致作者以一种通用的方式将单纯的代数结构(如monoid,monad和应用函子)描述为表示许多不同数据结构或API共有的属性的代数结构。

最后,第4部分介绍了I / O,并给出了依赖于前几章开发的概念访问数据库,文件或视频显示的实际应用程序的示例。

InfoQ借此机会向作者提出了一些问题,并进一步了解了他们对本书的意图。

InfoQ:您能解释一下写这本书的动机是什么?

Rúnar: Paul和我在Capital IQ的一个小团队中一起使用函数式编程取得了出色的成果,我们俩都非常活跃在波士顿的Scala社区。 我们决定每周召开一次工作会议,在会议上,我们将使用Scala向同事讲授FP概念。 我们使用的格式严重依赖练习,并且效果很好。 当时,在Scala中没有关于FP的书籍,甚至甚至没有我们可以使用的在线资源,因此我们必须自己制作所有材料。 当我们来自波士顿Scala聚会的朋友Nermin建议我们写一本关于该主题的书时,我们已经对要写的书有了一个很好的主意。

InfoQ:在这本书的简介中,您明确指出您的书不是关于Scala的,而是关于FP的介绍。 您能解释一下导致您选择Scala而不是另一种功能语言的原因吗?

鲁纳尔:嗯,关于在Scala中进行FP的资料不多。 因此,我们真的想弥合这一差距。 但不仅如此,我们还想以一种非常明确的方式介绍FP。 Scala不是纯粹的功能性语言这一事实​​对于本书中的材料而言是重要的激励手段。 在纯功能性语言中,根本不会出现以功能性方式还是通过副作用来进行操作的问题。 无论语言如何,我们都希望强调功能技术的价值。 FP在Scala中很自然,但是您必须做出明智的选择才能使用它。 这使它成为教授这些概念的好语言。

保罗:是的,在Scala中,我们不能仅仅接受它作为已做结论的原因,为什么一定要做一些没有副作用的事情,我们实际上必须激励它! 特别是在第1部分中,我们确实试图使连接变得清晰-许多章节都以一个问题开头,我们希望人们已经“知道”如何利用副作用来解决问题,并且展示了如何从功能上完成相同的事情。

对于使用哪种编程风格,Scala不是很“专心”。 您可以编写低级命令式代码或纯函数式代码,以及介于两者之间的所有内容。 我认为这种多功能性是为什么它在JVM上得到广泛采用的原因-除了一些新的语法外,几乎没有Java程序员绝对必须预先学习才能在Scala上变得富有成效,而且许多人开始将其用作“没有分号的Java”。 但是尽管Scala有一个很好的,渐进的采用故事,但由于没有人自以为是,所以刚接触Scala的开发人员往往会退而求其次地使用自己喜欢的东西,这通常意味着依赖副作用。 这个职位的许多人都对在Scala的FP方面进一步发展感兴趣,但缺乏这样做的良好途径。 我们确实希望为这个职位的开发人员提供一个连贯,完整的叙述,他们有兴趣充分利用Scala对FP的支持。

InfoQ:您的书与其他专注于函数式编程的书有何不同?

鲁纳尔:主要区别在于我们的书侧重于做而不是讲。 这些概念用通俗的英语解释,但是真正将其内在化的唯一方法是花费时间将它们应用于实际编程,思考它们并进行使用。 在学习和工作中,我们试图强调探索和娱乐的重要性。

保罗:我们肯定花了很多时间来开发本书中使用的练习。 练习很简单,可以独立完成,但也足够帮助读者阅读材料。 学习FP不仅仅是获取新知识或学习某种语法,还有新的思维方式和不同的学习技能,而发展这些东西的唯一方法就是实践。 我们希望这本书是获得这种实践的良好资源。

我还认为本书的第2部分相当独特,因为我们试图提供一个进入功能设计过程的窗口。 因此,我们不仅将漂亮的,功能完备的功能库转储到读者的腿上,还尝试至少显示出到达那里的凌乱过程的风格化视图。 当您教任何科目时,很容易进入只向学习者展示“成品”的模式。 当然,成品看起来不错,但是学习者不得不为自己想出类似的东西而scratch之以鼻。

InfoQ:您如何描述开发人员想要学习函数式编程的原因?

保罗:嗯,一方面,有一个非常实际的论点是,FP正在缓慢但肯定地接管整个行业。 这不只是一种时尚; FP是一个“伟大的想法,时机已到”,并且由于其非常明显的好处而越来越受欢迎。 这是实际的论点。 但这就是为什么我学习FP吗? 不完全是,我不是那么有意。 我只是发现这个主题既美丽,有趣又有趣,探索了我自己的好奇心,并且随着我获得更多的经验,收益变得越来越明显。

Rúnar:是的,我认为最重要的是,FP使编程更加有趣和容易。 编程已经是我可以想象到的最有趣的工作,FP极大地放大了这种乐趣。 我的代码更具可测试性和可重用性,并发变得简单明了。 而且,功能程序像Lego积木一样是组合的,因此它们以明显的方式组合在一起。 但是,您也可以按照自己喜欢的任何方式将它们拆开。

InfoQ:在您的书中,您介绍了函数式编程的基础,并介绍了诸如引用透明性,替换模型,纯度,惰性等概念。 然后,您将转向更高级的主题,例如API的代数性质,以及强大的抽象(如monoid,monad和应用函子)。 这是很多基础并且有些艰巨的学习任务。 您尝试建议哪种方法让读者掌握这种复杂性?

鲁纳尔:我不会说有很多复杂性。 FP实际上是一个简化的假设,而本书的后半部分只是我们早先介绍的基本原理的应用。 最终,这本书的信息是,任何程序都可以仅由一种东西构造而成:对不变数据进行操作的纯函数。 就是说,有很多材料要覆盖,而且涉及面很广。 因此,我们建议慢慢服用。 本书分为四个部分,我们认为最好在各个部分之间稍作休息,以真正运用您所学到的思想,并将其应用到一些实际的软件项目中。 与其他人一起做练习也会使一些人受益。 在工作中成立读书俱乐部,或加入本地(或在线)用户组。

保罗:是的,我非常同意FP实际上使编程更简单。 需要考虑的事情更少,程序出错的方式也更少。 如果没有FP经验,可能很难看到这一点,但是编写具有副作用的正确代码实际上是非常困难的! 但实际上,我不喜欢您说问题的方式。 学习一个深入,有趣且极其有用的主题是一件令人兴奋的事情。 这是一段美好旅程的开始-称它为“艰巨的任务”,这听起来像是一项繁琐的琐事,例如准备税金或填写RMV表格! 是的,在FP中有很多新的东西要学习,但是如果您按照自己的步调学习,保持“初学者的头脑”,并将学习本身视为一次有趣的冒险,那么您将会成功。

InfoQ:您在书中解释的最强大的概念之一就是API的代数数据类型和代数属性。 您能解释一下他们可以通过哪种方式改变编写代码的方式吗?

Rúnar:函数式编程的中心主题是组合性。 我们从一小堆原始数据中构造程序和数据,并遵循某些定律告诉我们事物如何组成更大的事物。 我们将一组原语与一些定律一起称为代数。 代数数据类型简化了我们的代码,特别是在我们的函数仅需要知道如何将数据类型解构为其组成部分的情况下。 由于没有副作用,因此实现功能永远不需要任何带外知识。 我们只是继续对其输入进行解构。 在更高的层次上,我们使用相同的原理设计整个系统和API。

保罗:我想说的是“代码应该抽象出来”。 也就是说,我们编写的任何代码段都应该被视为黑盒子,并嵌入更大的盒子中。 我们绝对需要这样做来管理软件的复杂性。 代数性质很重要,因为它们有助于“非泄漏”抽象。 当我们抽象出一系列与法律相关的价值和功能时,我们可以推断出更大的黑匣子的含义。 也就是说,代数帮助我们构建了构成新语义层的组件,而不是我们必须始终根据组成部分进行分解和理解的组件。

InfoQ:您能总结一下Monad在函数式编程中的重要性吗? Monad通常与内部的I / O,副作用或命令式编程相关,但是您可以从更广阔的角度介绍它们。

Rúnar:常见的误解是monads某种程度上与I / O或副作用有关。 但是monad只是我们设计API时可以利用的一种特殊的代数结构。 在本书中,我们讨论了具有单子结构的许多不同事物:从普通列表和函数到错误处理,状态机,随机数生成器,解析器,期货,命令性I / O,可变存储器单元等等。 有趣的是,所有这些东西都有其API的特定部分,在本书中,我们讨论了如何利用这一事实。 单子的重要性主要在于它们确实很常见。 因此,我们编写的代码和我们认为的想法(对于所有想法)都是高度可重用的。

InfoQ:函数式编程的最基本概念是什么,在继续之前应该真正掌握这些概念? 是否有一些基础概念值得更多关注?

Rúnar:当然,有些基本概念很重要,但是您没有学到足够的“许可”来开始进行FP。 只需在您目前满意的水平上进行即可。 该书列出了一些抽象概念,例如引用透明性,函子和monad。 但是,我们也使本书充满了练习,以帮助您完成最重要的事情,即获得大量练习并将FP真正集成到您的工作中。

保罗:除了只知道什么是副作用,而且了解FP意味着没有副作用的编程外,没有任何一个我真的会挑出来的概念。 我认为对于学习FP来说重要的是要有一定的心态,您将尝试在不使用副作用的情况下表达所编写的程序,并且如果一开始看起来很尴尬,则不要惊慌。 就是说,我认为在表达没有副作用的程序时会遇到两种态度。 您可以说:“哦,是的!这真是让人难以忍受,FP太复杂了,在这里不是正确的方法。” 或者您可以说:“嗯!我真的没有想到一种功能上实现此目标的好方法。不过,这真是一个不错的学习机会!我不能成为第一个遇到此问题的函数式程序员,我敢打赌一些我没想到的不错的方法。” 显然,如果您采用后一种观点,那么您将在学习上取得长足的进步,并且随着时间的流逝,在功能上表达程序变得毫不费力。

InfoQ:函数式编程通常被认为可以在代码行和开发时间上获得重大收益。 您在书中提出的哪些想法和方法更有可能带来这种收益?

Rúnar:根据我的经验,FP确实确实减少了我需要编写的代码量。 这是因为FP有助于消除很多复杂性,并且还可以重复使用许多代码。 您甚至可以说FP只是原则上消除代码中重复项的过程。 该书的第三部分“功能设计中的通用结构”确实是获得这种收益的部分。 这些结构很常见,这意味着我们可以编写可在出现的任何地方重复使用的代码。

Paul:我确实认为第3部分中介绍的结构确实清晰地展示了FP以对人们来说是新的方式实现了代码重用,并且显然解决了代码重复问题。 但是我们在每个级别都看到相同的好处。 甚至函数映射,过滤和在列表上折叠都在消除代码重复-而不是每次我们要处理列表时都手动写出循环,而是由通用函数组装这些循环。 如果我们发现自己一遍又一遍地重复某种模式,则可以轻松地将其抽象为一个不错的通用函数。 并且,对于所编写的所有代码,我们都采用相同的原则上消除重复的方式,无论是用于列表的代码还是抽象于多个不同功能库的代码。

另一个没有引起足够重视的是功能代码非常容易测试,通常比依赖副作用的代码要容易得多。 缺乏可测试性会浪费大量的生产力,人们并不会总是意识到花费大量时间来解决大量代码难以测试的事实。 查找和提取可能埋在大型应用程序中的纯函数,该应用程序在各处都使用副作用,可以极大地提高可测试性,并因此带来所有生产力。

InfoQ:正如您在书中所建议的那样,学习高级函数编程最困难的方面是什么? 在实践之外,有什么可以帮助您掌握它? 数学对理解您所涵盖的主题有多重要?

鲁纳尔:我真的只能从我自己的经验中学到这些。 我的背景是企业Java编程。 FP是一种完全不同的思维方式,因此改变心态可能是最困难的部分。 您必须保持初学者的心态,并且不要害怕冒险进入一开始什么都不懂的领域。 我没有接受过数学方面的正规培训,所以我不能说这是否会使事情变得容易。 的确,许多FP概念都来自数学,但是无论您准备就绪还是好奇,它们都是您可以在旅途中真正学习的东西。

保罗:我基本上会回覆鲁纳尔所说的话。 我确实认为数学背景会有所帮助,尤其是因为数学可以使您总体上适应抽象,这在FP中确实很重要,并且在构造数学证明时人们使用的思维方式与人们所做的那种思维非常相似汇编功能程序时。 但是我不认为数学是先决条件。 您绝对可以随心所欲地学习事物,但是无论如何它都会变得更好,因为您可以在上下文中学习。

就“ FP课程”而言,对我而言,有很多小小的弯弯曲曲的想法,回想起来,现在看来很简单。 我不认为这确实是FP特有的,任何具有很多想法的深层学科或学科在您学习时都会像这样。 再一次,我认为一个人的学习态度真的很关键-如果您将这些小小的大脑弯曲时刻视为学习新事物和有趣事物的令人兴奋的机会,那么它就不会像工作。

就是说,我认为可能困难的是如何处理陷入困境的理解。 有时,您只是无法通过自己拥有的学习资源或社区困惑自己,或者也许可以,但是您发现自己感到沮丧或不感兴趣。 我认为成立和参与学习社区确实可以在这里有所帮助,无论是在工作中的团队还是在当地的聚会。 即使我自己学习,也总是对我有所帮助,这仍然使学习处于低水平。 就是说,我尽量不要为截止日期很长的工作中的功能提供一些新的关键途径。 取而代之的是,我给自己做些修改的自由,如果我愿意的话,让它们呆一会儿,当我感到有动力和兴趣并且感到很有趣时,以我自己的节奏理解它们。 在此上花一些时间是我的荣幸,当您能够将这些新知识付诸实践时,它会带来很多好处。

您可以在manning.com上订购Scala(所有格式)的功能编程,可享受40%的折扣。 代码是 fpsinfoq

翻译自: https://www.infoq.com/articles/functional-programming-scala-review/?topicPageSponsorship=c1246725-b0a7-43a6-9ef9-68102c8d48e1

scala 函数式编程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值