相关疑难解决方法(0)

Haskell的大规模设计?

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

我已经阅读了很多教程(自己写一个方案是我最喜欢的,真实世界Haskell紧随其后) - 但大多数程序都相对较小,而且是单一目的.另外,我不认为它们中的一些特别优雅(例如,WYAS中的大量查找表).

我现在想要编写更大的程序,包含更多移动部件 - 从各种不同来源获取数据,清理数据,以各种方式处理数据,在用户界面中显示,持久化,通过网络进行通信等.一个最好的结构,这样的代码是易读,可维护,适应不断变化的要求?

有大量文献针对大型面向对象的命令式程序解决这些问题.像MVC,设计模式等的想法是实现广泛目标的理想规定,例如在OO风格中分离关注点和可重用性.此外,较新的命令式语言适合于"随着您的成长而设计"的重构风格,在我的新手看来,Haskell似乎不太适合.

Haskell有相同的文献吗?如何在功能性编程(单子,箭头,应用等)中使用异域控制结构的动物园最好地用于此目的?你能推荐什么最佳实践?

谢谢!

编辑(这是Don Stewart回答的后续行动):

@dons提到:"Monads在类型中捕获关键的建筑设计."

我想我的问题是:如何在纯函数式语言中考虑关键的架构设计?

考虑几个数据流的示例和几个处理步骤.我可以将数据流的模块化解析器编写为一组数据结构,我可以将每个处理步骤实现为纯函数.一个数据所需的处理步骤将取决于其值和其他数据.一些步骤之后应该是GUI更新或数据库查询等副作用.

什么是以正确方式绑定数据和解析步骤的"正确"方法?人们可以编写一个大功能,为各种数据类型做正确的事情.或者可以使用monad来跟踪到目前为止已处理的内容,并让每个处理步骤从monad状态获得接下来需要的任何内容.或者可以写很多单独的程序并发送消息(我不太喜欢这个选项).

他链接的幻灯片有一个我们需要的东西子弹:"将设计映射到类型/函数/类/ monad上的成语".什么是成语?:)

monads haskell functional-programming large-scale

565
推荐指数
7
解决办法
6万
查看次数

Monad Transformers vs将参数传递给函数

我是Haskell的新手,但了解如何使用Monad变形金刚.然而,我仍然难以获得他们声称的优势,而不是将参数传递给函数调用.

基于wiki Monad Transformers Explained,我们基本上将Config对象定义为

data Config = Config Foo Bar Baz
Run Code Online (Sandbox Code Playgroud)

传递它,而不是用这个签名编写函数

client_func :: Config -> IO ()
Run Code Online (Sandbox Code Playgroud)

我们使用ReaderT Monad Transformer并将签名更改为

client_func :: ReaderT Config IO ()
Run Code Online (Sandbox Code Playgroud)

然后拉动Config只是一个电话ask.

函数调用从更改client_func crunReaderT client_func c

精细.

但为什么这会使我的应用程序变得更简单?

1-我怀疑当你将许多功能/模块拼接在一起形成一个应用程序时,Monad变形金刚会感兴趣.但这就是我的理解停止的地方.有人可以请一些亮点吗?

2-我找不到任何关于如何在Haskell中编写大型模块化应用程序的文档,其中模块公开某种形式的API并隐藏它们的实现,以及(部分地)将其自己的状态和环境隐藏在其他模块中.有什么指针吗?

(编辑:真实世界Haskell声称"......这种方法[Monad变形金刚] ......扩展到更大的程序.",但没有明确的例子证明这种说法)

编辑关注Chris Taylor以下答案

克里斯完美地解释了为什么封装Config,State等等......在Transformer Monad中提供了两个好处:

  1. 它阻止更高级别的函数必须在其类型签名中维护它调用的(子)函数所需的所有参数,但不需要它自己使用(参见getUserInput函数)
  2. 因此,更高级别的功能可以更灵活地改变Transformer Monad的内容(假设您想添加一个Writer以提供更低级别功能的Logging)

这是以更改所有功能的签名为代价的,以便它们在Transformer Monad中"运行".

所以问题1已完全涵盖.谢谢克里斯.

现在在这篇SO帖子中回答了问题2

haskell monad-transformers

47
推荐指数
1
解决办法
3185
查看次数