Functional programming 有类似于功能模型的东西吗?

Functional programming 有类似于功能模型的东西吗?,functional-programming,modeling,Functional Programming,Modeling,在面向对象的范例中,在开始使用OO语言实现之前,我会创建一个对象/概念模型 在函数式编程中是否有与对象模型并行的东西。它叫功能模型吗?或者我们在两个范例中创建相同的概念模型,然后在其中一种语言中实现它 如果功能模型存在,是否有文章/书籍可供我阅读 或者换一种说法。。。即使我们使用的是函数式编程语言,我们会从对象模型开始吗?流程图和/或过程模型/图表可以用作非面向对象程序的函数模型。但它仍然没有给出类似于OO模型的边界感 事实上是有。有一种基于抽象数据类型的函数式语言规范称为代数规范。它们的行为在

在面向对象的范例中,在开始使用OO语言实现之前,我会创建一个对象/概念模型

在函数式编程中是否有与对象模型并行的东西。它叫功能模型吗?或者我们在两个范例中创建相同的概念模型,然后在其中一种语言中实现它

如果功能模型存在,是否有文章/书籍可供我阅读


或者换一种说法。。。即使我们使用的是函数式编程语言,我们会从对象模型开始吗?

流程图和/或过程模型/图表可以用作非面向对象程序的函数模型。但它仍然没有给出类似于OO模型的边界感


事实上是有。有一种基于抽象数据类型的函数式语言规范称为代数规范。它们的行为在某些方面与对象的行为非常相似,但是这些结构是逻辑和数学的,并且像函数结构一样是不变的

在布宜诺斯艾利斯大学的算法和数据结构类中使用的特定函数规范语言具有生成器、观察器和附加操作。 生成器是一个表达式,它既是数据类型的实例,也是数据类型的可能组合。 例如,对于二叉树(ADT bt),我们有空节点和二进制节点。因此,我们将有发电机:

-nil
-bin(left:bt, root: a, right:bt)
其中,left是一个bt实例,root是一个通用值,right是另一个bt。 因此,nil是bt的有效形式,但是bin(bin(nil,1,nil),2,nil)也是有效的,它表示一个二叉树,根节点的值为2,左子节点的值为1,右子节点的值为空

因此,对于一个计算树中节点数的函数,定义ADT的观察者,定义一组映射到每个生成器的公理。 例如:

numberOfNodes(nil) == 0
numberOfNodes(bin(left,x,right))== 1 + numberOfNodes(left) + numberOfNodes(right)
这具有使用递归操作定义的优势,并且具有更有趣的形式属性,您可以使用称为结构归纳的东西来证明您的规范是正确的(是的,您可以证明您的算法将产生正确的结果)

这是一个在学术界之外很少见到的相当学术性的话题,但深入了解程序设计是值得的,它可能会改变您对算法和数据结构的思考方式。 适当的参考书目包括:

伯诺,G.,比多伊特,M.,和克纳皮克,T。 1995观测规范和不可区分性假设。 理论。计算机。Sci。139,1-2(3月。 1995), 275-314. 内政部=

Guttag,J.V.和Horning,J.J.1993。 Larch:正式语言和工具 规范。斯普林格-维拉格新酒店 约克公司 软件开发规范, Barbara Liskov y John Guttag,麻省理工 新闻界,1986年

代数基础 规格1。方程和初始值 语义学。H.Ehrig y B.Mahr 斯普林格·维拉格,柏林,海德堡, 纽约,东京,德国,1985年

与相应的链接:


这是一个非常有趣的话题。

在OO和FP范例中,您形成域模型(您正在解决的问题),然后在程序中创建对象以镜像域对象。有一些区别,程序对象镜像域对象的方式受您使用的范例和语言的影响。一些示例(在Haskell中):

  • 财务部:
  • 从文字处理:
  • 一个简单的web服务器:
  • 音乐:

如果您喜欢使用递归数据类型编程,请参阅“使用香蕉、镜头、信封和铁丝网进行函数编程”[1]。它很有趣,教会了我很多。[1] :=