我遇到的情况是,小组中的大多数人都来自面向对象的编程背景,对功能编程的了解很少甚至没有。甚至没有像闭包这样的基础知识。
关于将其介绍给功能编码样式的好方法的任何建议?如果我们针对特定情况采用功能性方法,则可以简化许多编码工作。
我已经给出了一些有关功能和编码范例的介绍。不幸的是,我们没有使用像Haskell这样的适当的函数式编程语言(基本上,遗留代码是C,C ++,Java),因此我们必须使用它们进行任何处理。
我遇到的情况是,小组中的大多数人都来自面向对象的编程背景,对功能编程的了解很少甚至没有。甚至没有像闭包这样的基础知识。
关于将其介绍给功能编码样式的好方法的任何建议?如果我们针对特定情况采用功能性方法,则可以简化许多编码工作。
我已经给出了一些有关功能和编码范例的介绍。不幸的是,我们没有使用像Haskell这样的适当的函数式编程语言(基本上,遗留代码是C,C ++,Java),因此我们必须使用它们进行任何处理。
Answers:
Luca Bolognese进行了精彩的演讲,他使用一个咖啡示例介绍了函数式编程(以介绍F#),这确实很棒,并帮助了我很多朋友和同事们介绍函数式编程。
您也可以看一下Petricek 的《现实世界中的函数式编程》,这是我认为开始进行功能性思考的绝佳方法。
您的同事是否在工作以外进行编码?
考虑到您在公司没有任何FP,那么当任何人在直接工作任务之外不做任何事情时,要让他们学习一种新的语言/范例几乎是不可能的。
如果他们这样做了,那么找到他们喜欢的与函数式编程有关的有趣项目并向他们展示。您无权进行更改,因此,如果出于个人角度考虑,则必须播种。这就是我被介绍给我的方式-由我最好的朋友碰巧与我一起工作。
除此之外,大多数人都编写内部工具来简化小型任务。尝试用功能语言编写其中的一些。任何想要查看代码的人都会(希望/可能)对代码感到惊奇,并在这样做时可能会询问您。这是一个出售想法的机会。
请记住,有一些功能语言可以在您的堆栈上运行(scala / closure都在JVM上运行)。它不像Haskell那样“纯粹地起作用”,但这是漫长旅程的一个良好开始。
如果您可以控制雇用,请雇用具有一定功能经验(或至少对功能编程感兴趣)的人员。
最后...如果您热衷于编写功能代码,那么您可能会选择错误的公司。您不会改变整个公司编写软件的方式-尤其是如果他们在赚钱,更重要的是不会在相当短的时间内赚钱。
这就是将其出售给开发人员的全部……管理完全是另一种野兽。
从命令式编程切换到纯函数式编程是一个很大的变化,学习曲线陡峭。我建议尝试不太快速的过渡,在这种情况下,您有很多选择。例如,Python支持列表推导和生成器表达式,Ruby 通过代码块支持高阶函数,等等。自从您提到Java以来,如果所有人都有Java背景并且想要全功能编程支持,则可以尝试Scala。
为提到Scala的理由+1了:这开始是对该答案的评论,但太大了...
我想学习一些有关函数式编程的知识(来自C / C ++,一些Python和生锈的Java);我尝试过与Ocaml进行深入交流,然后尝试Haskell和Just Did n't Get It。然后我尝试了Scala,发现它使我可以在舒适的OOP / Java-ey环境中开始使用功能性的东西,当我无法使用功能性方法时,我很容易退回到熟悉的命令式风格。有人可能会抱怨这种语言的“多范式”,“混合”特性意味着您永远不会被强迫伸张自己成为“纯粹的功能”,但是我想说这的确意味着您可以对事物务实,并且知道自己会能够在需要时轻松地完成真实工作。
几年(以及Scala中200多个Project Euler Scala解决方案)在功能上的遭遇无疑影响了我的Python(比起我,更多地使用了map,filter,reduce,lambda,itertools,列表理解和传递函数) d)以及在较小程度上使用C ++:也许更多尝试使用STL的功能陷阱,但是主要的影响是我更愿意使用TBB的map / reduce构造,并且真的很喜欢利用不变性可以驯服复杂性在多线程代码中。
因此,就我个人而言,如果我是您,那么我将为将Scala引入您的Java世界开发中提供一个理由,最好通过显示一些示例来极大地简化某些事情并产生您所声称的利益。接下来发生的事情将取决于“倡导”新想法并推动变革的整个业务……这听起来可能是一个更大的问题。
我想推荐使用Scala的渐进方法。我建议从Scala的创作者的书“在Scala中编程,第二版”开始。本书很神奇,正在慢慢地介绍使用Scala的(FP)函数式编程。而且在展示向FP的转变时,它并不拒绝OO。实际上,它利用了它。我现在正在第二遍。
基本上,Scala允许人们“不用分号”执行Java / OO。然后,您可以尝试一点FP,而不必全力以赴。例如,在训练自己做FP时,我通常将重点放在类方法级别的引用透明性上,但是让我的方法具有许多var-s,可变性和命令性,这是我在首次通过时需要的一个实现。然后,我专注于缓慢地重做每种方法以使其朝着纯FP方向发展。我还使用姊妹站点StackOverflow的CodeReview来获得有关我的思维/思维转换的帮助。这是我最近做此事的一个例子。
无论如何,祝您在FP旅途中一切顺利。:)