从OOP思想转变为.NET中纯粹的功能导向编程思维有多难?

时间:2010-10-25 00:58:14

标签: c# f# functional-programming

自beta以来,我一直与C#合作多年。我有一点时间,从OOP转到functional-oriented programming(FOP)。我从20世纪80年代后期开始使用procedural programming和功能组合的概念,自1995年左右UML处于起步阶段时我一直在做OO,我在Delphi编程程序和面向对象的范式方法。是否有任何好的书籍建议,以帮助从根深蒂固的OO程序员过渡到函数式编程?

我试了一本Haskell书,但它似乎需要一些背景知识并且非常难以接近。

我有几本关于F#的O'ReillyApress书籍,但这一切看起来都有点毛茸茸,只是完成工作。它还将对象与功能混合在一起以满足需求。

F#似乎原谅我在OOP中的思考比Haskell更多,但我认为要获得真正的好处,我需要进入FOP的思维模式以充分利用代码。我在日常的C#内容中阅读了大约两年的函数式编程。但我觉得我没有深入思考。

我很确定那里有很多像我一样的人。我认为,任何答案对许多希望转移到F#的C#人员都有很大的帮助。特别是在市场上有许多大型击球手要求F#。我是一名需要尽快加快速度的承包商。

4 个答案:

答案 0 :(得分:10)

这绝对是主观的,但我认为很多人都在问类似的问题。当我开始学习F#时,我确实做过(作为有C#经验的人)。以下是一些不同的想法:

  • 选择正确的学习问题 - 学习函数式编程的最佳方法是开始处理一些非平凡的项目。如果您选择一个易于以OO方式解决的项目,那么您可能会倾向于OO解决方案。但是,如果您选择一些自然适合FP解决方案的项目,那么您将学到一些东西。就我而言,我从事F#引用到JavaScript的翻译工作,涉及大量的递归处理和有区别的工会。

  • 不要试图做到完美 - 如果你尝试以功能方式写东西,那么在第一次尝试时它可能并不完美。不要担心(并且不要对自己说你可以用OO方式做得更好)。你也可以用FP方式做得更好 - 只需要一些时间来了解如何做到这一点。

  • 尝试纯粹主义 - 如果你开始学习Haskell,那么你将不得不编写纯粹的功能代码。 F#没有强制执行,但我认为这不会使F#不适合学习函数式编程。如果你了解C#和.NET,你可以重用很多经验。只是尝试对自己更严格,避免使用非可执行的构造,如可变状态和继承 - 它们有时很有用,但你可以在学会用FP方式思考后使用它们。

有点无耻的插件 - 回答这样的问题是我Real World Functional Programming书的主要动机之一,所以也许这可能有帮助...

答案 1 :(得分:3)

  

是否有任何好的书籍建议,以帮助从一个根深蒂固的OO程序员过渡到函数式编程

计算机程序的结构和解释(SICP):

他的课程似乎主要集中在功能构成上。它在LISP中,但它不是关于语言,而是关于抽象概念。

我不认为他对纯粹的FP说了很多(或任何其他内容),但我还没有真正阅读过所有这些内容。但是,概念和思维方式仍应高度适用。

答案 2 :(得分:2)

我认为,要真正理解函数式编程,首先必须重新组织有关实现不同事物的方法的所有知识(例如,您必须了解对象可能表示为哈希映射甚至是关联列表,而不仅仅是记录)。此外,您还需要开始考虑不可变数据和纯函数(无副作用的过程)。然后,您将不得不比较实现和处理对象的功能和程序方法。

所有这一切都可以在SICP中找到 - 经典书籍不仅可以学习FP,还可以学习一般的编程。要理解功能方式,您不必阅读所有书籍,但至少要阅读前3章。

在了解了主要FP概念并能够实现其风格的任何内容之后,请阅读有关静态类型语言的任何书籍。例如。关于F#的Apress书籍将更容易阅读。

答案 3 :(得分:1)

Learn You a Haskell是一个不错的读物,虽然它可能有点太基础了,因为你可能已经从你选择的那本书中知道了Haskell的语法......

向上移动,有Programming in Haskell,如果你在该页面向下滚动,它会根据MS Research的Erik Meijer给出的书提供一系列视频讲座链接。

Equational Reasoning的内容特别有趣,如果只是学术上的话。

在应用方面,在另一个答案中给出的真实世界功能编程书看起来非常好 - 虽然我没有读过它,所以我无法作出任何判断。