Architecture 函数式编程体系结构

Architecture 函数式编程体系结构,architecture,functional-programming,Architecture,Functional Programming,我熟悉面向对象的体系结构,包括使用设计模式和类图进行可视化,我知道面向服务的体系结构及其契约和协议绑定,但是用函数式编程语言编写的系统的软件架构有什么特点吗? 我知道FP已用于中型到大型项目。保罗·格雷厄姆写下了雅虎的第一个化身!存储在公共Lisp中。一些lisp开发系统是复杂的。用函数式语言编写的人工智能和金融系统可能会变得非常庞大。它们至少都有某种固有的架构,我想知道它们是否有共同点 基于表达式求值的体系结构是什么样子的?FP体系结构更可组合吗 更新:Kyle提醒我这是一个很好的主题资源 更

我熟悉面向对象的体系结构,包括使用设计模式和类图进行可视化,我知道面向服务的体系结构及其契约和协议绑定,但是用函数式编程语言编写的系统的软件架构有什么特点吗?

我知道FP已用于中型到大型项目。保罗·格雷厄姆写下了雅虎的第一个化身!存储在公共Lisp中。一些lisp开发系统是复杂的。用函数式语言编写的人工智能和金融系统可能会变得非常庞大。它们至少都有某种固有的架构,我想知道它们是否有共同点

基于表达式求值的体系结构是什么样子的?FP体系结构更可组合吗

更新:Kyle提醒我这是一个很好的主题资源


更新2:我找到了一篇关于这个主题的好文章:

函数式语言中最大的共性是使用函数存储数据。这有点像在没有对象的对象上使用访问器函数。相反,函数是在可以访问所需数据的环境中创建的。现在这个函数可以在任何地方传递和使用,并且仍然保留使用数据的能力

这里有一个非常简单的例子。这并不完全是功能性的,因为它确实会改变状态,但它非常常见:

(define (make-counter)
  (let ((count 0))
    (lambda ()
      (set! count (+ count 1))
      count)))

(define x (make-counter))

(x) returns 1

(x) returns 2

...etc...
所以我们有一个函数,make counter,它返回另一个函数,其中包含计数器的状态。我们可以称之为新创建的计数器,并观察其内部的变化


这就是功能程序的结构。有些函数将函数作为参数,有些函数返回隐藏状态的函数,等等。这比自己管理内存要干净得多。

我曾经处理过一些相当大的函数项目。他们通常分为两个阵营(至少是我使用过的阵营):

  • 极高的可扩展性/可靠性/并发性。事务模型可以非常紧密地构建到该语言中。并发ML就是一个很好的例子,使用它的项目在并发正确性方面很难出错
  • 解析/修改框架。这些框架所基于的许多设计模式都非常容易用函数式语言制定/构建/修改。访问者模式就是一个很好的例子

我打印出来并查看了一下,他们使用模块和函子(以及对象)来重新创建我们习惯的正常设计模式。这很有趣,但我认为他们使用对象太多,无法真正看到函数式语言的好处。FP是非常可组合的,这是其本质的一部分。我想我的简短回答是使用模和函子


我当前的项目相当大,我们用文件分隔每个模块——ocaml中的隐式文件。我一直在寻找一个全面的资源,可能有一些其他的观点或想法,一个真正成功的设计出来的项目

我认为这可能会有所帮助

有些模式消失了,那就是 是的,它们由 语言特性,一些模式是 更简单或有不同的焦点,以及 有些基本上没有变化

[AIM-2002-005]Gregory T.Sullivan

二○○二年三月二十二日

设计模式手册[GOF95] 提供24种经过时间测试的模式 始终以精心设计的方式出现 软件系统。每种模式都是 介绍了 模式解决的设计问题, 以及示例实现代码 以及设计考虑。本报 探索如何从 “四人帮”或“GOF”书 常被称为,出现时相似 使用一个 动态、高阶、面向对象 编程语言。一些 模式消失了,也就是说,它们 由语言直接支持 功能,有些模式更简单或更简单 有不同的焦点,有些是 基本上没有变化

使用函数式语言的项目的“体系结构”的共同点是,它们往往被分成代数层,而不是传统系统体系结构意义上的子系统

有关此类项目的优秀示例,请查看,然后单击。如果你检查它们是如何构造的,你会发现它们由一元结构的层组成,层与层之间有一些组合胶


另请看一篇论文,该论文概述了一个体系结构,其中系统由抽象出依赖关系的组件组成。

希望不要太过切题,但对于任何浏览此问题答案的人来说可能都很有趣。Peter Norvig的这篇演示文稿。

我目前正在编写这本书“函数式编程中的设计和体系结构”。它描述了纯FP世界中存在的许多设计模式和方法(主要语言是Haskell),但不仅如此。这本书教你如何从零开始使用纯和非纯状态、多线程、网络、数据库、GUI构建大型应用程序,如何将其划分为多个层并获得简单性。它还展示了如何对域和语言进行建模,如何组织和描述应用程序的体系结构,如何对其进行测试,等等

主题列表包括:

  • 使用图表进行架构建模的方法
  • 需求分析
  • 嵌入式DSL领域建模
  • 外部DSL设计和实现
  • 单子作为具有效应的子系统
  • 自由单子作为功能接口
  • 箭头化EDSL
  • 使用自由一元EDSL进行控制反转
  • 软件事务存储器
  • 镜片
  • 州、读者、作者、RWS、圣莫纳德
  • 不纯状态:IORef,