功能编程架构

功能编程架构

Functional Programming Architecture

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

我知道FP已用于中型到大型项目。保罗·格雷厄姆(Paul Graham)撰写了Yahoo!的第一个化身。存放在Common Lisp中。一些Lisp开发系统很复杂。用功能语言编写的人工智能和金融系统可能会变得非常庞大。它们都至少具有某种固有的体系结构,但是,我想知道它们是否有共同点?

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

更新:凯尔(Kyle)提醒我,SICP是此主题的不错资源。

更新2:我在以下主题上找到了一篇不错的文章:函数式编程如何影响代码的结构?


使用功能性语言的项目"体系结构"中的共同点是,它们倾向于分为代数层,而不是传统系统体系结构意义上的子系统。

有关此类项目的绝佳示例,请查看XMonad,Yi和HappS。如果检查它们的结构,您会发现它们由单层结构组成,中间夹有一些组合胶。

另请参阅Scala实验论文,该论文概述了体系结构,其中系统由对其依赖项进行抽象的组件组成。


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

主题列表包括:

  • 使用图进行体系结构建模的方法;
  • 需求分析;
  • 嵌入式DSL域建模;
  • 外部DSL的设计与实现;
  • 单声道作为具有效果的子系统;
  • 免费的monad作为功能接口;
  • 箭形eDSL;
  • 使用免费monadic eDSL进行控制反转;
  • 软件事务存储;
  • 镜片;
  • 状态,读者,作家,RWS,ST单子;
  • 不纯状态:IORef,MVar,STM;
  • 多线程和并发域建模;
  • GUI;
  • UML,SOLID,GRASP等主流技术和方法的适用性;
  • 与不纯子系统的交互。

这本书基于我正在研究的Haskell项目,尤其是SCADA应用程序Andromeda。本书的代码可在此处获得。虽然本书正在开发中(将在2017年完成),但我建议您在这里熟悉我的文章" FP中的设计和体系结构"(俄罗斯)。

更新

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


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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
(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,它返回另一个具有内部计数器状态的函数。我们可以调用该新创建的计数器并观察内部的变化。

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


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


我打印并查看了Ocaml中的"设计模式",它们使用模块和函子(和对象)来重新创建我们习惯的正常设计模式。这很有趣,但是我认为他们过多地使用对象,以至于无法真正看到功能语言的好处。 FP非常容易组合,这是其本质的一部分。我想我的简短答案是使用模块和函子。

我当前的项目很大,我们通过文件将每个模块分开-隐含在ocaml中。我也一直在寻找全面的资源,对于从项目中获得的真正成功的设计,可能会有一些其他观点或想法。


我已经处理了一些相当大的功能项目。它们通常分为两个阵营(至少是我使用过的阵营):

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


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

Some of the patterns disappear -- that
is, they are supported directly by
language features, some patterns are
simpler or have a different focus, and
some are essentially unchanged.

[AIM-2002-005] Gregory T. Sullivan,可执行设计模式的高级编程语言功能"通过反射实现更好的模式

2002年3月22日

The Design Patterns book [GOF95]
presents 24 time-tested patterns that
consistently appear in well-designed
software systems. Each pattern is
presented with a description of the
design problem the pattern addresses,
as well as sample implementation code
and design considerations. This paper
explores how the patterns from the
"Gang of Four'', or"GOF'' book, as it
is often called, appear when similar
problems are addressed using a
dynamic, higher-order, object-oriented
programming language. Some of the
patterns disappear -- that is, they
are supported directly by language
features, some patterns are simpler or
have a different focus, and some are
essentially unchanged.


推荐阅读

    车载电脑系统编程|车载电脑操作系统

    车载电脑系统编程|车载电脑操作系统,,1. 车载电脑操作系统白名单的概念与“黑名单”相对应。白名单是设置能通过的用户,白名单以外的用户都

    1.设计模式概述

    1.设计模式概述,模式,原则,[toc]1.为什么要使用设计模式使用设计模式可以重构整体架构代码、提交代码复用性、扩展性、减少代码冗余问题。

    台式电脑编程|台式电脑编程方便吗

    台式电脑编程|台式电脑编程方便吗,,台式电脑编程方便吗学习电脑锣cnc编程大约分为以下阶段:第一阶段:学徒期①熟悉机床的操作,保养,以及检具、

    zb编程快捷键|zb操作快捷键

    zb编程快捷键|zb操作快捷键,,1. zb操作快捷键取消上一步的编辑操作指令,即撤销。 返回上一步的快捷键是Ctrl+Z。2. zb设快捷键天正建筑命

    c语言运行快捷键|c语言编程快捷键

    c语言运行快捷键|c语言编程快捷键,,c语言编程快捷键格式化的快捷键是 alt + f8 只针对选择的部分.运行c语言快捷键C语言作为一门起源比较

    a6驻车制动电脑编程|奥迪A6驻车制动

    a6驻车制动电脑编程|奥迪A6驻车制动,,1. 奥迪A6驻车制动使用方法:在等红绿灯或需要短暂停车时,按下车上自动驻车按钮就可以启动,此时可以不需

    电脑怎样直接编程|电脑怎么进行编程

    电脑怎样直接编程|电脑怎么进行编程,,1. 电脑怎么进行编程  运用笔记本电脑进行编程,需要搭建编程专属的开发环境,以及熟练的电脑操作水平