Architecture 功能语言中的建筑思维

Architecture 功能语言中的建筑思维,architecture,f#,functional-programming,Architecture,F#,Functional Programming,我的相关问题框充满了函数式编程问题。在回顾了最相关的内容之后,我仍然很想听到以下方面的意见: 您如何看待用函数式语言构建应用程序 我不是说特定语言的语法。我对概念性组织范式(例如面向对象)感兴趣 和许多人一样,我第一次接触封装和代码重用是在OO背景下。由于我一直在研究不同的语言,函数式编程确实吸引了我的眼球。我开始理解不变性、高阶函数等的好处。但我仍然不知道如何在不依赖OO概念的情况下构造功能性应用程序。实际上,我看到的许多函数示例与意大利面条代码有更多的共同点,尽管我确信这是由于示例的简单性,

我的相关问题框充满了函数式编程问题。在回顾了最相关的内容之后,我仍然很想听到以下方面的意见:

您如何看待用函数式语言构建应用程序

我不是说特定语言的语法。我对概念性组织范式(例如面向对象)感兴趣

和许多人一样,我第一次接触封装和代码重用是在OO背景下。由于我一直在研究不同的语言,函数式编程确实吸引了我的眼球。我开始理解不变性、高阶函数等的好处。但我仍然不知道如何在不依赖OO概念的情况下构造功能性应用程序。实际上,我看到的许多函数示例与意大利面条代码有更多的共同点,尽管我确信这是由于示例的简单性,而不是函数方法中的任何固有缺陷


这个问题类似于“我什么时候应该使用函数式编程”,但我已经确信函数式方法,尽管在某些领域有利弊,但它几乎可以用于任何您想要的东西。我只是很难描绘出一个复杂应用程序的整体结构。

大多数总体设计模式都完全适用:

关注点分离;模型控制演示(在其所有变体中);分层体系结构;输入过程输出等

一旦你把一个大问题分解成了一个小问题,小问题就是通过从源到目标的各种转换


我发现,输入-处理-输出模式和转换管道模式有帮助。

在20世纪70年代末,Barbara Liskov和其他人开发了大量大规模的“面向对象设计”技术,这些技术至今仍在广泛使用,并在函数式编程中保持不变。它们最容易应用于具有显式接口和实现的语言,这意味着标准ML(接口称为“签名”,实现称为“结构”或“函子”)或目标Caml(接口称为“模块类型”,实现称为“模块”)。如果您更喜欢Scheme,那么Matthew Flatt和Matthias Felleisen开发的“单元”语言将内置到PLT Scheme中,这是表示大规模函数的一种非常好的方式

简言之:

  • 围绕抽象类型(OO中的类,“FP中的抽象类型”)和对这些类型的操作组织应用程序

  • 使用封装机制(OO中的类,FP中的模块)隐藏抽象类型的表示

  • 构造应用程序,使每个实现通过接口间接地依赖于其他实现。通过这种方式,您可以限制构建或修改应用程序任何一部分所需的代码量

  • 进城去

主要区别在于,在编写函数式程序时,不使用继承来重用实现。相反,您使用高阶函数,或者使用


摘要:在体系结构层面上,没有太大的区别,但在使用函数式语言时,您可能需要更努力地寻找所需的封装机制。

非常棒的答案。一般来说,采用模块参数的方法是否存在性能缺陷,或者是否只需要花费一个指针?(Javascript是我的心理模型)@DanielMason:对于一个幼稚的编译器,您所付出的开销与在面向对象语言中所付出的开销大致相同:模块由指向vtable的指针表示。但是更好的编译器在跨模块边界内联小函数方面做得很好,因此它们的开销更小。MLton是一个非常好的全程序编译器,所以根本没有运行时开销。谢谢你的跟进。这让我有很多要深入研究的地方。不幸的是,F#(这是唯一一种在这个问题上加上标签的特定语言)不支持以其他模块为参数的模块。谢谢你的回答。我对编程相当陌生,所以很多术语我都不熟悉——这是一件好事,需要更多的探索。在维基百科上花上几个小时没有什么是不能治愈的。重复:请在发布新问题之前尝试搜索:感谢链接到有用的帖子。然而,我在这个网站上搜索了很长一段时间,没有找到任何与此直接相关的东西。显然,我没有使用正确的术语来生成上面的链接。假设一个用户在其他近50万人中找不到类似的问题时甚至没有尝试搜索,这是一种标准做法吗?我想我们可以深入到用Ocaml、F#、Lisp等编写的开源项目,看看其他程序员是如何设计他们的程序的。