功能设计模式


106

有很多功能性习语:m​​onad,applicatives,arguments等。它们在不同的文章中都有记录,但不幸的是,我不知道任何本书或文章在一个地方对其进行了总结(有Typeclassopedia,但它有很多覆盖率不高的区域)。任何人都可以推荐一篇文章/书,该书/书在一个地方就可以很好地覆盖它们,并且对FP具有中级技能的程序员可以访问吗?


它不直接回答你的问题,但这个问题的其他有一些有趣的信息(至少一个链接或两个):stackoverflow.com/questions/327955/...
鲁本

15
您能在Typeclassopedia涵盖的哪些方面做得更好吗?
dave4420'7

2
@ dave4420如果我从头到尾阅读typeclassopedia,则阅读的内容越多,我的理解就越少。前几节真的很好,但后几节对我来说很难理解。
康斯坦丁·索洛玛托夫

3
@KonstantinSolomatov可能是您需要研究不了解的部分,查看博客文章,并认真研究代码。类型分类中的所有这些“设计模式”都是真正的抽象,并且通常是很深的抽象,有时需要一段时间才能沉入。
jberryman

1
@DanBurton不确定您是否误读了我的评论,但我会将所有这些归类为深层抽象,尽管您忘记了“啊哈!”时很容易忘记。时刻。
jberryman

Answers:


35

我的建议是,如果您想学习Scala,请阅读Paul Chiusano和Runar Bjarnason的书:

http://manning.com/bjarnason/

第二部分:功能设计和组合器库

  1. 少用语言
  2. JSON序列化
  3. 基于规范的测试
  4. 解析器
  5. 纯功能并行
  6. 纯功能状态

第三部分:功能设计模式

  1. 抽象的情况
  2. Monoids
  3. 函子
  4. 单音
  5. 适用函子
  6. 可遍历和可折叠的数据结构
  7. 科莫纳兹

第四部分:打破规则:效果和I / O

  1. 效果与副作用
  2. 流处理和增量I / O
  3. 使用类型系统加强效果范围

31

抱歉,我不了解详细介绍所有这些构造的不同用法的文章或书籍,但我可以为您提供一些指向各个资源的链接。

一个很常见的模式是构建monad转换器,而不是简单的monad(另请参见下一段中的链接)。从根本上讲,这意味着您需要构建必须与其他monad结合使用的东西,从而导致能够处理它们两者功能的更复杂的东西。

真实世界的Haskell中,有几章涉及monad。在第14章中,作者解释了Monad的基本知识和一些常用用法(也许是列表,状态)。第15章使用monad编程提供了有关如何有效使用它们的更多解释(它也涵盖了读者monad)。下一章将说明如何使用Parsec,,但是搜索涵盖其实际工作方式的文章可能会更有趣:这应该是一个很好的示例,说明如何使用monad进行解析。Fianlly,第18章。Monad 变压器介绍monad转换器的工作原理,然后逐步说明如何构建一个转换器。对本章最后部分的考虑也很有趣。

我曾经读过一个关于单子的创造性用法的非常有趣的问题。建议的链接是关于该主题的精彩阅读。本着这种精神,我试图向箭头索取同样的东西:我得到的答案肯定比单子上的答案少,但是仍然很有趣。


关于由四人组成的OOP模式,IBM撰写了三篇很好的文章,涉及其系列功能思维中的主题。目标功能语言是Scala。他们通过解释OOP中的常规设计模式并展示如何映射到Scala中着手进行。

  1. 功能思维:功能设计模式,第1部分。在这里,它们涵盖了工厂,模板方法,策略,权重。最重要的是,通过将函数用作一等值,一切都变得更加简单。
  2. 功能思维:功能设计模式,第2部分。这是关于java和groovy的。它解决了适配器模式。
  3. 功能思维:功能设计模式,第3部分。他们在这里谈论解释器模式。同样,目标语言是俗套的。

与您的问题最相关的文章肯定是第一个,但是其他两个可能还是有趣的相关读物。


谢谢,但我指的是不同类型的模式,例如Monad,Arrow,Applicative no GoF模式。
康斯坦丁·索洛玛托夫

@KonstantinSolomatov:对不起,我误解了你的问题。我为单子和箭头添加了一些参考。
Riccardo T.

18

杰里米·吉本斯(Jeremy Gibbons)在FP博客中有一个Patterns,这注定最终会成为您所要的书。当然,这还没有达到您现在想要的那样有用,但是他值得鼓励!

同时,我将为Brent Yorgey的Typeclassopedia说+1。这真的很有用,如果以后有一些令人困惑的部分,那么此站点是深入了解它们的好地方。我知道布伦特会对它进行审查。如果他没有吸引他的读者,请给他一些帮助。



5

您是否阅读过“ 了解Haskell的伟大成就”的后续章节?

  • 第6章介绍了地图和折页,这是功能语言中最重要的两种“设计模式”。

  • 第11-13章按此顺序介绍了函子,适用函子和Monad。这很有用-许多教程先介绍Functor,然后介绍Monads,然后在末尾附加Applicative Functor(如果它们涵盖了所有内容)。LYAH中的顺序更好,因为从Functors => Applicative Functors => Monads转变为使您逐渐提高一般性和能力的阶梯。

  • 第14章介绍了Zippers-您可以有效地将它们视为具有指向特定数据的指针的容器类,这意味着您可以访问O(1)并在指针位置进行更新。

它不涉及“箭头”或“共鸣”,这是Haskell中更高级的主题。要了解如何以及为什么使用Arrows或Comonads,您一定已经对Monads有了牢固的了解,因此我认为这不是问题-LYAH坚定地瞄准了Haskell市场的新手。


1
是的,我读过这本书。我很喜欢它。不幸的是,它没有隐藏箭头和许多其他高级模式。我还想了解有关Monad和Applicatives的更多信息(例如,LYHGG不涵盖延续Monad)。
康斯坦丁·索洛玛托夫2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.