在面向对象的范式中,我会在开始使用OO语言实现对象/概念模型之前创建它。
在函数式编程中有没有类似于对象模型的东西?它被称为功能模型吗?或者我们在两种范式中创建相同的概念模型,然后在其中一种语言中实现它。
如果函数模型存在,有没有我可以阅读的文章/书籍?
或者换个说法..。即使我们使用的是函数式编程语言,我们会从对象模型开始吗?
发布于 2008-12-02 05:40:33
事实上是有的。有一种基于抽象数据类型的函数式语言规范,称为代数规范。它们的行为在某些方面非常类似于对象的行为,但是这些构造是逻辑和数学的,并且像函数构造一样是不可变的。
在布宜诺斯艾利斯大学的算法和数据结构类中使用的一种特殊的函数规范语言具有生成器、观察器和附加操作。生成器是一个表达式,它既是数据类型的实例,也是数据类型的可能组合。例如,对于二叉树(ADT bt),我们有null节点和二进制节点。所以我们会有生成器:
-nil
-bin(left:bt, root: a, right:bt)其中left是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. 1995。观测规范和不可区分性假设。西奥尔。计算。Sci。139,1-2 (1995年3月),275-314。DOI= http://dx.doi.org/10.1016/0304-3975(94)00017-D
Guttag,J. V.和Horning,J.J. 1993。Larch:形式化规范的语言和工具。Springer-Verlag New York,Inc.软件开发中的抽象和规范,Barbara Liskov y John Guttag,麻省理工学院出版社,1986。
代数规范的基础1.方程和初始语义。施普林格-维拉格,柏林,海德堡,纽约,东京,德国,1985年。
带对应链接:http://www.cs.st-andrews.ac.uk/~ifs/Resources/Notes/FormalSpec/AlgebraicSpec.pdf http://nms.lcs.mit.edu/larch/pub/larchBook.ps
这是一个非常有趣的话题。
发布于 2009-01-06 03:14:27
在OO和FP范例中,您都会形成您的域模型(您正在解决的问题),然后在您的程序中创建对象来镜像域对象。这里有一些不同之处,因为程序对象镜像域对象的方式受到所使用的范例和语言的影响。一些示例(在Haskell中):
来自金融的
发布于 2008-11-13 20:03:56
流程图和/或过程模型/图可以用作非OO程序的功能模型。但是它仍然没有给出类似于OO模型的边界的感觉。
http://en.wikipedia.org/wiki/Functional_model
https://stackoverflow.com/questions/288027
复制相似问题