从编程生涯的第一天开始,我开始使用面向对象的编程.但是,我有兴趣学习其他范例(我在这里说了很多次这是一件好事,但我没有时间去做).我想我不仅准备好了,而且还有时间,所以我将开始用F#进行函数式编程.
但是,我不确定如何构建更少的设计应用程序.我已经习惯了OO编程中的每类文件和类名词/函数动词.您如何设计和构建功能性应用程序?
阅读SICP.
此外,还有PDF版本.
您可能想查看我最近的博客文章:函数式编程如何影响代码的结构?
在较高的层面上,OO设计方法对于构建F#程序仍然非常有用,但是当你降低到较低级别时,你会发现这种情况会破坏(规则的更多例外).在物理层面,"每个文件一个类"在所有情况下都不起作用,因为需要在同一个文件中定义相互递归类型(类型 Class1 = ... 和Class2 = ...),你的一些代码可能存在于未绑定到特定类的"自由"函数中(这就是F#"模块"的优点).F#中的文件排序约束也会迫使您批判性地思考程序中类型之间的依赖关系; 这是一把双刃剑,因为它可能需要更多的工作/思考来解开高级别的依赖关系,但会产生的程序组织方式总是让它们变得平易近人(因为最原始的实体总是先行,你可以总是从"从上到下"阅读一个程序并逐个引入新的东西,而不是只是开始查看一个充满代码文件的目录而不知道"从哪里开始".
如何设计程序是关于这一点(令人厌烦的长度,使用Scheme而不是F#,但原则延续).简而言之,您的代码镜像您的数据类型; 这个想法可以追溯到老式的"结构化编程",只有函数式编程更明确,并且具有更高级的数据类型.
鉴于现代函数语言(即不是lisps)默认使用早期绑定的多态函数(高效),并且面向对象只是一种安排具有多态函数的特定方式,如果你知道如何设计适当的封装类.
Lisps使用后期绑定来实现类似的效果.说实话,没有太大的区别,除了你没有明确地声明类型的结构.
如果您已经使用C++模板函数进行了大量编程,那么您可能已经有了一个想法.
在任何情况下,答案都是小"类",而不是修改内部状态,您必须返回具有不同状态的新版本.