有很多功能性习语:monads、applicatives、arrows 等。它们在不同的文章中都有记录,但不幸的是,我不知道任何一本书或文章将它们总结在一个地方(有Typeclassopedia,但它有很多没有被很好地覆盖的区域)。任何人都可以推荐一篇文章/书籍,它可以在一个地方很好地涵盖它们并且可以让具有 FP 中级技能的程序员可以访问?
5 回答
我的建议是,如果您想学习 Scala,请阅读 Paul Chiusano 和 Runar Bjarnason 的书:
第二部分:功能设计和组合库
- 制作小语言
- JSON序列化
- 基于规范的测试
- 解析器
- 纯功能并行
- 纯功能状态
第三部分:功能设计模式
- 抽象案例
- Monoids
- 函子
- 单子
- 应用函子
- 可遍历和可折叠的数据结构
- 共生体
第四部分:打破规则:效果和 I/O
- 效果与副作用
- 流处理和增量 I/O
- 使用类型系统强制执行效果范围
很抱歉,我不知道有哪些文章或书籍详细介绍了所有这些结构的不同用法,但我可以为您提供一些指向各个资源的链接。
一个非常常见的模式是构建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 部分。在这里,它们涵盖了工厂、模板方法、策略、享元。底线是,通过将函数作为第一类值,一切都变得更加简单。
- 功能性思维:功能性设计模式,第 2 部分。这是关于 java 和groovy的。它解决了适配器模式。
- 功能性思维:功能性设计模式,第 3 部分。在这里,他们谈论解释器模式。同样,目标语言是时髦的。
与您的问题最相关的文章肯定是第一篇,但另外两篇可能是有趣的相关读物。
Jeremy Gibbons 有一个Patterns in FP 博客,它最终注定会成为你想要的书。当然,这还没有达到你现在想要的那么有用的状态,但他值得一些鼓励!
同时,我会为 Brent Yorgey 的 Typeclassopedia 说 +1。它真的很有用,如果后面的部分令人困惑,这个网站是一个深入了解它们的好地方。我知道布伦特一直在审查它。如果他没有接触到他的读者,请给他一些帮助。
很多 FP 的东西都发布在 Oleg 的网站上:http: //okmij.org/ftp/
Josh Suereth 关于 FP 模式的介绍:http: //jsuereth.com/intro-to-fp/
你读过《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 市场的初学者端。