设计/构建大型功能程序的好方法是什么,特别是在Haskell中?
我已经阅读了很多教程(自己写一个方案是我最喜欢的,真实世界Haskell紧随其后) - 但大多数程序都相对较小,而且是单一目的.另外,我不认为它们中的一些特别优雅(例如,WYAS中的大量查找表).
我现在想要编写更大的程序,包含更多移动部件 - 从各种不同来源获取数据,清理数据,以各种方式处理数据,在用户界面中显示,持久化,通过网络进行通信等.一个最好的结构,这样的代码是易读,可维护,适应不断变化的要求?
有大量文献针对大型面向对象的命令式程序解决这些问题.像MVC,设计模式等的想法是实现广泛目标的理想规定,例如在OO风格中分离关注点和可重用性.此外,较新的命令式语言适合于"随着您的成长而设计"的重构风格,在我的新手看来,Haskell似乎不太适合.
Haskell有相同的文献吗?如何在功能性编程(单子,箭头,应用等)中使用异域控制结构的动物园最好地用于此目的?你能推荐什么最佳实践?
谢谢!
编辑(这是Don Stewart回答的后续行动):
@dons提到:"Monads在类型中捕获关键的建筑设计."
我想我的问题是:如何在纯函数式语言中考虑关键的架构设计?
考虑几个数据流的示例和几个处理步骤.我可以将数据流的模块化解析器编写为一组数据结构,我可以将每个处理步骤实现为纯函数.一个数据所需的处理步骤将取决于其值和其他数据.一些步骤之后应该是GUI更新或数据库查询等副作用.
什么是以正确方式绑定数据和解析步骤的"正确"方法?人们可以编写一个大功能,为各种数据类型做正确的事情.或者可以使用monad来跟踪到目前为止已处理的内容,并让每个处理步骤从monad状态获得接下来需要的任何内容.或者可以写很多单独的程序并发送消息(我不太喜欢这个选项).
他链接的幻灯片有一个我们需要的东西子弹:"将设计映射到类型/函数/类/ monad上的成语".什么是成语?:)
每当我点击IPython中的向上箭头,而不是获取历史记录时,我会得到这组字符"^ [[A"(不包括引号).
点击向下箭头给出"^ [[B",并且标签完成不起作用(只需输入标签).
我怎样才能解决这个问题?它发生在终端和iTerm.
运行OS X 10.5,Framework Python 2.5.4.ipython 0.8.3和ipython 0.9.1都出错.两种情况下都安装了pyreadline-2.5.1 egg.
(编辑:SSH到另一台Linux机器并使用IPython工作正常.所以在OS X机器上运行正常的"python"命令.)
干杯, - 丹
我正在尝试为Python编写Wilson的谱密度分解算法[1]的实现.该算法迭代地将[QxQ]矩阵函数分解为其平方根(它是用于谱密度矩阵的Newton-Raphson平方根查找器的扩展).
问题是我的实现仅收敛于45x45及更小的矩阵.因此,在20次迭代之后,矩阵之间的总平方差约为2.45e-13.但是,如果我输入大小为46x46的输入,则直到第100次迭代才会收敛.对于47x47或更大,矩阵永远不会收敛; 对于大约100次迭代,误差在100和1000之间波动,然后开始非常快速地增长.
您将如何尝试调试此类内容?似乎没有任何特定的点,它变得疯狂,并且矩阵太大,我实际上不能手动进行计算.有没有人有寻找奇怪的数字错误的提示/教程/启发式?
我以前从未处理过这样的事情,但我希望你们有些人......
谢谢, - 丹
[1] GT Wilson."基质谱密度的因式分解".SIAM J. Appl.数学(Vol 23,No.4,1972年12月)
我正在寻找一种干净,惯用的方式在Clojure中进行"向后缩减".
我有
(def fns '(fn1 fn2 fn3))
(def val 42)
Run Code Online (Sandbox Code Playgroud)
我想获得(fn3 (fn2 (fn1 val)))
,而且我对这个订单并不挑剔.所以我想连续地将一系列函数应用于一个值,而不是连续地将一系列值应用于函数.
建议?谢谢!