107

有很多功能性习语:m​​onads、applicatives、arrows 等。它们在不同的文章中都有记录,但不幸的是,我不知道任何一本书或文章将它们总结在一个地方(有Typeclassopedia,但它有很多没有被很好地覆盖的区域)。任何人都可以推荐一篇文章/书籍,它可以在一个地方很好地涵盖它们并且可以让具有 FP 中级技能的程序员可以访问?

4

5 回答 5

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. 使用类型系统强制执行效果范围
于 2012-07-09T11:20:57.423 回答
31

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

一个非常常见的模式是构建monad 转换器而不是简单的 monad(另请参见下一段中的链接)。这基本上意味着您构建的东西必须与其他 monad 结合,从而产生一个更复杂的东西,能够处理它们两者的特性。

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

我曾经读过一个关于 SO 的关于创造性使用 monads的非常有趣的问题。建议的链接是关于该主题的精彩阅读。带着这种精神,我试图对箭头提出同样的要求:我得到的答案肯定比单子上的要少,但仍然很有趣。


关于四人组的 OOP 模式,IBM 在他们的功能性思维系列中有一组很好的关于该主题的 3 篇文章。目标函数式语言是 Scala。他们继续解释 OOP 中的常用设计模式并展示它们如何映射到 Scala。

  1. 功能性思维:功能性设计模式,第 1 部分。在这里,它们涵盖了工厂、模板方法、策略、享元。底线是,通过将函数作为第一类值,一切都变得更加简单。
  2. 功能性思维:功能性设计模式,第 2 部分。这是关于 java 和groovy的。它解决了适配器模式。
  3. 功能性思维:功能性设计模式,第 3 部分。在这里,他们谈论解释器模式。同样,目标语言是时髦的。

与您的问题最相关的文章肯定是第一篇,但另外两篇可能是有趣的相关读物。

于 2012-07-05T08:09:23.673 回答
18

Jeremy Gibbons 有一个Patterns in FP 博客,它最终注定会成为你想要的书。当然,这还没有达到你现在想要的那么有用的状态,但他值得一些鼓励!

同时,我会为 Brent Yorgey 的 Typeclassopedia 说 +1。它真的很有用,如果后面的部分令人困惑,这个网站是一个深入了解它们的好地方。我知道布伦特一直在审查它。如果他没有接触到他的读者,请给他一些帮助。

于 2012-07-05T09:20:32.813 回答
9

很多 FP 的东西都发布在 Oleg 的网站上:http: //okmij.org/ftp/

Josh Suereth 关于 FP 模式的介绍:http: //jsuereth.com/intro-to-fp/

于 2012-07-05T14:57:28.567 回答
5

你读过《Learn You a Haskell for Great Good 》后面的章节吗?

  • 第 6 章介绍了映射和折叠,这是函数式语言中两个更重要的“设计模式”。

  • 第 11-13 章依次介绍了 Functor、Applicative Functor 和 Monad。这很有帮助 - 许多教程先介绍 Functor,然后介绍 Monad,然后在最后添加 Applicative Functor(如果它们完全涵盖的话)。LYAH 中的顺序更好,因为从 Functors => Applicative Functors => Monads 移动你逐渐提升了一般性和权力的阶梯。

  • 第 14 章介绍了 Zippers——你可以有效地将它们视为带有指向特定数据的指针的容器类,这意味着你可以在指针位置获得 O(1) 访问和更新。

它不包括 Arrows 或 Comonads,这是 Haskell 中更高级的主题。要了解如何以及为什么要使用 Arrows 或 Comonads,您绝对应该已经牢牢掌握 Monads,所以我认为这不是问题 - LYAH 坚定地针对 Haskell 市场的初学者端。

于 2012-07-05T08:29:52.410 回答