|
|
1
519
我在里面谈过这个 Engineering Large Projects in Haskell 而在 Design and Implementation of XMonad. 大型工程就是管理复杂性。Haskell中用于管理复杂性的主要代码结构机制是: 类型系统
剖析器
纯度
测试
结构单子
类型类和存在主义类型
并发性和并行性
重构
明智地使用外国金融机构
元程序设计
包装与配送
警告
使用所有这些工具,您可以控制复杂性,尽可能地消除组件之间的交互。理想情况下,您有一个非常大的纯代码基础,这非常容易维护,因为它是复合的。这并不总是可能的,但值得瞄准。 一般来说: 分解 将系统的逻辑单元放入尽可能小的引用透明组件中,然后在模块中实现它们。组件集(或内部组件)的全局或本地环境可能映射到monad。使用代数数据类型来描述核心数据结构。广泛分享这些定义。 |
|
|
2
118
Don给出了上面的大部分细节,但这里是我在haskell中做一些非常简单的有状态的程序(如系统守护进程)的两分钱。
补遗
(摘自评论;感谢
Lii
和;
liminalisht
-
Ben Kolera
对这个话题作了一个非常实际的介绍,并且
Brian Hurt
讨论解决问题的方法
|
|
|
3
43
用haskell设计大型程序和用其他语言设计没有什么不同。 大型编程是将问题分解为可管理的部分,以及如何将这些部分组合在一起;实现语言不那么重要。 也就是说,在大型设计中,最好尝试并利用类型系统,以确保您只能以正确的方式将各个部分组合在一起。这可能涉及新类型或幻影类型,以使具有相同类型的内容看起来不同。 在进行重构时,纯度是一个很大的好处,所以尽量保持尽可能多的代码是纯的。纯代码很容易重构,因为它与程序的其他部分没有隐藏的交互。 |
|
|
4
16
我第一次用这本书学习了功能编程。 这可能不是你想要的,但对于初学者来说,这可能是学习构建功能程序的最好的第一步——独立于规模。在所有抽象层次上,设计应始终具有清晰排列的结构。
函数编程的技巧
http://www.cs.kent.ac.uk/people/staff/sjt/craft2ee/ . 这可能不是你想要的,但对于初学者来说,这可能是学习构建功能程序的最好的第一步——独立于规模。在所有抽象层次上,设计都应该有清晰的结构安排。
函数编程的技巧
|
|
|
5
11
我目前正在写一本题为“功能设计和建筑”的书。它为您提供了一套完整的技术,如何使用纯功能方法构建大型应用程序。它描述了许多功能模式和想法,同时构建了一个类似于SCADA的应用程序“仙女座”来从头开始控制宇宙飞船。我的母语是哈斯克尔。这本书包括:
你可能会熟悉这本书的代码 here 和 'Andromeda' 项目代码。 我希望在2017年底完成这本书。在这之前,您可以阅读我的文章“功能编程中的设计和体系结构”(RUS)。 here . 更新 我在网上分享了我的书(前5章)。见 post on Reddit |
|
|
6
7
加布里埃尔的博客帖子 Scalable program architectures 也许值得一提。
我经常会想到,一个看似优雅的建筑往往会从那些以自下而上的方式展现出这种美妙的同质性的图书馆中掉出来。在haskell中,这一点尤其明显——传统上被认为是“自顶向下的体系结构”的模式往往在类似 mvc , Netwire 和 Cloud Haskell . 也就是说,我希望这个答案不会被解释为试图取代这个主题中的其他任何一个,只是结构选择可以并且应该被领域专家理想地抽象到库中。在我看来,构建大型系统的真正困难在于评估这些库的体系结构“优点”,而不是所有的实际问题。 AS liminalisht 在评论中提到, The category design pattern 是加布里埃尔关于这个话题的另一篇文章,也是类似的。 |
|
|
7
5
我找到报纸了 " Teaching Software Architecture Using Haskell " (pdf) 作者Alejandro Serrano,对思考Haskell的大规模结构很有用。 |
|
|
8
3
也许您必须后退一步,首先考虑如何将问题的描述转换为设计。由于haskell具有很高的层次性,它可以以数据结构、作为过程的操作和作为函数的纯转换的形式捕获对问题的描述。然后你有了一个设计。当您编译此代码并在代码中找到关于丢失字段、丢失实例和丢失单元转换器的具体错误时,开发就开始了,因为例如,您从需要在IO过程中使用特定状态单元的库中执行数据库访问。瞧,有节目。编译器为您提供思想上的草图,并为设计和开发提供一致性。 这样一来,从一开始你就可以从Haskell的帮助中获益,而编码是自然的。如果你所想的是一个具体的普通问题,我不想做一些“实用的”、“纯粹的”或足够一般的事情。我认为过度工程是其中最危险的事情。当问题是创建一个抽象一组相关问题的库时,情况就不同了。 |