design - Haskell中的大型设计?

  显示原文与译文双语对照的内容

什么是设计/构造大型功能程序的好方法,特别是 Haskell?

我已经通过了很多教程( 你自己写一个我最喜欢的方案,真实的Haskell第二个) - 但是大部分程序都比较小,而且 single-purpose 。 另外,我不认为其中一些是特别优雅的( 例如WYAS中的大量查找表) 。

我现在希望进一步编写较大的程序,随着对移动部件- 从各种不同的源采集数据,清洗它,在各种方式加以处理,将它的显示在用户界面中,持久化了,通信覆盖了网络,等等 怎么会公认的最佳结构这样的代码是清晰和可以维护的,并且能适应需求变化的?

对于大型object-oriented命令式程序,有相当大的文献处理这些问题。 在 00 style,的概念,比如 MVC,设计模式,等等 在体面的处方药为实现广泛的目标,如分离各种复杂关系和 reusability. 此外,更新的命令式语言将自己归功于一种'随着你的成长设计'风格的重构,在我看来,Haskell似乎不太 well-suited 。

是否有关于Haskell的等效文献? 在函数编程中,奇异控制结构的动物园是如何使用的? 你可以推荐哪些最佳实践?

谢谢!

编辑Stewart的( 这是一个不回答的问题):

@dons 提到:"清单中的monads在类型中获取关键架构设计。"

我想我的问题是: 如何用纯函数语言思考关键架构设计?

考虑几个数据流的示例,以及几个处理步骤。 我可以将数据流的模块解析器写入一组数据结构,并将每个处理步骤作为纯函数实现。 一个数据所需的处理步骤取决于它的值和其他数据。 一些步骤应该遵循诸如GUI更新或者数据库查询之类的副作用。

如何以良好的方式绑定数据和解析步骤? 可以编写一个大函数,对各种数据类型做正确的事情。 或者,可以使用monad来跟踪目前处理的内容,并让每个处理步骤从monad状态下得到任何需要。 或者可以编写大量独立的程序并在( 我不喜欢这个选项) 周围发送消息。

他链接的幻灯片有我们需要子弹的东西: "将设计映射到 types/functions/classes/monads".的习惯用法"? : )

时间:

post可以伸缩程序架构的博客可能值得提及。

Haskell设计模式与主流设计模式有一个重要的区别:

  • 传统架构: 组合使用几种类型的组件连接在一起,一个来生成"网络"或者"拓扑结构"乙型

  • 的Haskell架构: 将几个组件组合在一起,生成一个类型相同的新组件,在字符与它的替代部件的特征中,生成相同的类型

我经常想到,一个看似优雅的架构往往会从展示了这种均匀性的库中脱颖而出,在自下而上的方式中。 在接触Haskell这一点尤为- 模式,而传统上被视为"自上而下架构"倾向于编程之类的库中捕获 mvcNetwire云接触 Haskell 。 也就是说,我希望这个答案不会被解释为尝试替换这个线程中的任何一个,仅仅是结构选择可以被领域专家在库中抽象出来。 在我看来,构建大型系统的真正困难是在它们的架构"goodness"上评估这些库,而不是你所有的实际关注点。

...