40

我熟悉面向对象的体系结构,包括使用设计模式和类图进行可视化,并且我知道面向服务的体系结构及其合同和协议绑定,但是对于用函数式编程语言?

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

基于表达式评估的架构是什么样的?FP 架构是否更具可组合性?

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

更新 2:我找到了一篇关于这个主题的好帖子: 函数式编程如何影响你的代码结构?

4

7 回答 7

22

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

有关此类项目的优秀示例,请查看XMonadYiHappS。如果您检查它们的结构,您会发现它们由单子结构层组成,中间有一些组合胶。

另请参阅 The Scala Experiment论文,该论文概述了一种体系结构,其中系统由抽象其依赖关系的组件组成。

于 2008-09-18T23:49:52.937 回答
10

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

主题列表包括:

  • 使用图表进行架构建模的方法;
  • 需求分析;
  • 嵌入式 DSL 领域建模;
  • 外部DSL设计和实现;
  • 单子作为具有效果的子系统;
  • 自由单子作为功能接口;
  • 带箭头的 eDSL;
  • 使用 Free monadic eDSL 进行控制反转;
  • 软件事务内存;
  • 镜片;
  • 状态、读取器、写入器、RWS、ST 单子;
  • 不纯状态:IORef、MVar、STM;
  • 多线程和并发域建模;
  • 图形用户界面;
  • UML、SOLID、GRASP等主流技术和方法的适用性;
  • 与不纯子系统的交互。

这本书基于我正在研究的 Haskell 项目,尤其是 SCADA 应用程序Andromeda。本书的代码可在此处获得。虽然这本书正在开发中(它将在 2017 年完成),我可以建议您在此处(Rus)熟悉我的文章“FP 中的设计和架构”。

更新

我在网上分享了我的书(前 5 章)。见 Reddit 上的帖子

于 2016-11-07T04:16:20.633 回答
3

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

这是一个非常简单的例子。这不是纯粹的功能,因为它确实改变了状态,但它很常见:

(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,它返回另一个函数,里面有计数器的状态。我们可以调用那个新创建的计数器并观察里面的变化。

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

于 2008-09-18T01:46:50.917 回答
3

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

我当前的项目非常大,我们通过文件分隔每个模块——ocaml 中的隐式。我也一直在寻找一个综合资源,它可能对项目产生的真正成功的设计有一些不同的观点或想法。

于 2008-09-18T13:48:01.713 回答
2

我曾参与过一些相当大的功能性项目。他们通常分为两个阵营(至少是我用过的阵营):

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

希望不要太切题,但对于浏览这个问题的答案的任何人来说可能很有趣的是Peter Norvig的动态编程中的设计模式演示文稿。

于 2008-09-24T08:10:33.137 回答
1

我认为这可能会有所帮助;

一些模式消失了——也就是说,它们被语言特性直接支持,一些模式更简单或有不同的侧重点,还有一些本质上没有变化。

[AIM-2002-005] Gregory T. Sullivan,可执行设计模式的高级编程语言特性“通过反射获得更好的模式

2002 年 3 月 22 日

设计模式一书 [GOF95] 介绍了 24 种经过时间考验的模式,这些模式始终出现在精心设计的软件系统中。每个模式都附有对模式解决的设计问题的描述,以及示例实现代码和设计注意事项。本文探讨了当使用动态、高阶、面向对象的编程语言解决类似问题时,通常被称为“Gang of Four”或“GOF”一书中的模式如何出现。一些模式消失了——也就是说,它们被语言特性直接支持,一些模式更简单或有不同的侧重点,还有一些本质上没有变化。

于 2008-09-18T20:15:58.507 回答