你如何devise一个function程序?
从我的编程生涯第一天起,我开始使用面向对象编程。 然而,我有兴趣去学习其他的范例(我曾经在这里说过的东西有好几次是好事,但我没有时间去做)。 我想我不仅准备好了,而且还有时间,所以我将用F#开始函数式编程。
但是,我不确定如何构build更less的devise应用程序。 我习惯于OO编程中的每个文件和类名词/函数动词的一个概念。 你如何devise和构buildfunction性应用程序?
阅读SICP 。
此外,还有一个PDF版本可用。
你可能想看看我的最近的博客条目: 函数式编程如何影响你的代码的结构?
在高层次上,OOdevise方法对于构build一个F#程序仍然非常有用,但是当你处于较低的层次时,你会发现这种情况发生了变化(更多的例外情况)。 在物理层面上,“每个文件一个类”在所有情况下都不起作用,因为需要在相同的文件中定义相互recursion的types( types Class1 = … 和 Class2 = …),并且有一点代码可能驻留在没有绑定到特定类的“空闲”函数中(这是F#模块的优点)。 F#中的文件sorting约束也会迫使你批判性地思考程序中types之间的依赖关系; 这是一把双刃剑,因为它可能需要更多的工作/思想去解决高层次的依赖关系,但是会产生以一种总是让他们易于接近的方式组织的程序(因为最原始的实体总是先到先,总是从上到下阅读一个程序,并逐一引入新的东西,而不仅仅是开始寻找一个充满代码文件的目录,而不知道从哪里开始。
如何devise程序是关于这个的(无聊的长度,使用Scheme而不是F#,但原则inheritance)。 简而言之,您的代码将镜像您的数据types; 这个想法可以追溯到老式的“结构化编程”,只有函数式编程更加明确,并且具有更加奇特的数据types。
鉴于现代函数式语言(即不是lisp)默认使用早期绑定的多态函数(高效),而面向对象只是安排具有多态函数的一种特殊方式,所以它并不是真的很不一样,如果你知道如何devise正确的封装类。
Lisp使用后期绑定来实现类似的效果。 说实话,除了你没有明确声明types的结构之外没有太大的区别。
如果你已经用C ++模板函数进行了广泛的编程,那么你可能已经有了一个想法。
在任何情况下,答案都是小的“类”,而不是修改内部状态,你必须返回一个不同状态的新版本。
F#为大规模结构化编程(例如接口)提供了传统的面向对象方法,而不是试图提供像OCaml(例如函子)这样的语言开创性的实验方法。
因此,F#程序的大规模结构基本上与C#程序相同。
函数式编程当然是一个不同的范例。 也许最简单的方法就是坚持用stream程图来devisedevise。 每个function是独特的,没有inheritance,没有多态性,独特。 数据从函数传递到函数以进行删除,更新,插入和创build新数据。
在构buildfunction程序上:
虽然OO语言使用类来构造代码,但function性语言使用模块来构造它。 对象包含状态和方法,模块包含数据types和function。 在这两种情况下,结构单元组数据types以及相关的行为。 这两种模式都有build立和执行抽象障碍的工具。
我强烈build议你select一个你熟悉的函数式编程语言(F#,OCaml,Haskell或Scheme),然后长时间看看它的标准库是如何构build的。
例如,比较OCaml Stack模块与.NET中的System.Collections.Generic.Stack或Java中的类似集合。
这完全是关于纯函数,以及如何构build它们来构build更大的抽象。 实际上,这是一个难度很大的问题,需要一个强大的math背景 。 幸运的是,有几种模式具有深入的正式和实用的研究。 关于function性和react native领域build模 Debasish Ghosh进一步探讨了这个话题,并将几个实际的场景应用到了纯粹的function模式中:
function性和react native领域build模教会你如何从纯粹的functionangular度思考领域模型,以及如何构build它们来build立更大的抽象。 您将从function性编程的基础知识入手,并逐步深入到实现复杂领域模型所需了解的高级概念和模式。 本书演示了代数数据types,基于typestypes的devise以及隔离副作用等高级FP模式如何使您的模型成为可读性和可validation性的组成部分。