最近,我遇到了这个关于函数编程的不同方面的有用资源的帖子,例如monads和monoids等。
但问题是,一个普通的程序员能从这些概念中得到什么用呢?我经常会遇到关于这些问题的“学术”研究。然而,我从来没有见过在实践中(在一个真正的项目)任何人使用它们。
所以问题是,在Haskell,是否有任何广泛使用的开源项目真正利用了这些东西,这些项目证明了这种概念在“生产”软件中的实际必要性,而不是在“学术”软件中所写的“只是为了好玩”。列一张这样的单子是很酷的:
发布于 2011-11-28 13:34:43
这些概念在Haskell代码中是如此的隐含,因此列出不使用它们的示例就更容易了(假设您可以找到它们)。每个Haskell程序都使用monads,至少对于IO是这样的。
所有这些都被广泛使用,因为它们是在代码中经常出现的抽象。考虑函子:在容器上映射是一个相当普遍的需求,所以为任何类似容器的数据结构都有一个接口是有意义的,这正是函子所提供的。碰巧,即使是“容器”的概念也比函子抽象更具体,但希望这说明了这一点。
monad:XMonad窗口管理器是一个广泛使用的程序,它广泛使用了monad变压器和拉链结构。STM是一个库,它提供了一个具有有用属性的新monad。
Monoids:Sequence包中的containers结构是用一元实现。此外,由于两个单子运算提供了一个空列表和连接(或一个空集和联合),所以单列被广泛地用于建模集、列表和类似的类。
箭头:雅帕和HXT (Haskell )立即出现在脑海中。
函子到处都是。非常常见的是,一元代码有很多<$>,这意味着Functor实例正在使用。最多 Haskell 解析器大量使用函子。
发布于 2011-11-28 12:09:29
我在实际应用中使用箭头和monads (因此也是函子)。我的功能反应编程(玻璃钢)库内特维尔结合了你提到的所有四个概念和更多,而且玻璃钢本身也是一个设计模式,你通常从学者那里知道。以下是所使用的概念:
Wire类型,这是一个箭头变压器。Wire通常转换为由Kleisli箭头包装的单台变压器堆栈。第3版即将发布(我希望今天),这也将带来(非相关)类型的家庭游戏。
发布于 2011-11-28 13:45:28
埃提斯的回答和约翰·L的回答都很棒。我只想补充一些关于函子和一元论的东西:我相信Haskell的许多术语,虽然其精确性很好,但对新的Haskell程序员来说,可能有点令人讨厌。我总是告诉新来的人,单子植物可以被认为是“附属物”,函子可以被认为是“映射体”。显然,这种同义化有一些损失,但它有助于克服语言最初的词汇障碍。单类接口(typeclass)具有“追加”和“标识”函数,而函子只指定映射函数。附加和映射的常年概念(例如,求和是一种附加)之间存在一定的偏差,但基本思想仍然有效。
作为附加和映射的简单接口,一元和函子很快就会显示出它们有许多用途:每当您的数据结构需要支持附加或映射时,您就会有一段时间将数据结构作为单类或函子的实例来简化过程。
希望那是有帮助的。
随后,这里列出了您询问过的库。
函子:查看像attparsec这样的解析库。http://hackage.haskell.org/package/attoparsec-0.10.0.2函子允许您轻松地组合解析器,这样您就可以为甚至复杂的数据编写易于编写、易于阅读的解析器。将attoparsec解析器与类似的正则表达式进行对比!
Monoid:查看任何数组,向量库(http://hackage.haskell.org/packages/archive/vector/0.9/doc/html/Data-Vector.html),以了解Monoid用于实现单子图的附属性。另外,这是一篇很好的文章,可以让单子植物为http://blog.sigfpe.com/2009/01/haskell-monoids-and-their-uses.html工作。
Monad:看看Data.Binary --一个简单而基本的Haskell库--以获得Monad的完美用例。通过使用monads,您可以编写一系列复杂的指令,以几乎命令式的方式解析二进制文件。
https://stackoverflow.com/questions/8295295
复制相似问题