在面向对象的范例中,我将在使用OO语言开始实现它之前创建一个对象/概念模型。
在函数式编程中是否存在与对象模型平行的任何内容。它被称为功能模型吗?或者我们在使用其中一种语言实现它之前在范例中创建相同的概念模型。
是否存在可以阅读有关功能模型的文章/书籍?
或以不同的方式...即使我们使用函数式编程语言,我们会从对象模型开始吗?
答案 0 :(得分:6)
实际上有。有一种基于抽象数据类型的函数式语言规范形式,称为代数规范。它们的行为在某些方面与对象的行为非常相似,但构造是逻辑和数学的,并且像函数构造一样是不可变的。
布宜诺斯艾利斯大学的算法和数据结构课程中使用的特定功能规范语言包括生成器,观察器和其他操作。 生成器是一个表达式,它既是实例又是数据类型的可能组合。 例如,对于二叉树(ADT bt),我们有空节点和二进制节点。所以我们有发电机:
-nil
-bin(left:bt, root: a, right:bt)
如果左边是bt的实例,则root是通用值,right是另一个bt。 所以,nil是bt的有效形式,但是bin(bin(nil,1,nil),2,nil)也是有效的,表示具有值为2的根节点的二叉树,左子节点值为1,以及null子右节点。
因此,对于一个函数,即计算树中节点的数量,您可以定义ADT的观察者,并定义一组映射到每个生成器的公理。 所以,例如:
numberOfNodes(nil) == 0
numberOfNodes(bin(left,x,right))== 1 + numberOfNodes(left) + numberOfNodes(right)
这具有使用递归操作定义的优点,并且具有更多,正式有趣的属性,您可以使用称为结构归纳的东西来证明您的规范是正确的(是的,您证明您的算法将产生正确的结果)。
这是一个在学术界很少见到的相当学术性的话题,但值得深入了解程序设计可能会改变您对算法和数据结构的看法。 适当的参考书目包括:
Bernot,G.,Bidoit,M。和Knapik,T。 观察规范和不可分辨性假设。 理论值。 COMPUT。科学。 139,1-2(3月 1995),275-314。 DOI = http://dx.doi.org/10.1016/0304-3975(94)00017-D
Guttag,J。V.和Horning,J。J. 1993。 落叶松:正式的语言和工具 规格。 Springer-Verlag New 约克公司抽象和 软件开发规范, 麻省理工学院的Barbara Liskov和John Guttag Press,1986。
代数基础 规范1.方程和初始 语义。 H. Ehrig和B. Mahr Springer-Verlag,柏林,海德堡, 纽约,东京,德国,1985年。
使用相应的链接: http://www.cs.st-andrews.ac.uk/~ifs/Resources/Notes/FormalSpec/AlgebraicSpec.pdf http://nms.lcs.mit.edu/larch/pub/larchBook.ps
这是一个有趣话题。
答案 1 :(得分:1)
在OO和FP范例中,您构建域模型(您正在解决的问题),然后在程序中创建对象以镜像域对象。存在一些差异,因为程序对象如何镜像域对象受到您正在使用的范例和语言的影响。一些例子(在Haskell中):
答案 2 :(得分:0)
流程图和/或流程模型/图表可用作非OO程序的功能模型。但它仍然没有给出类似于OO模型的边界感。