【问题标题】:Functional design patterns [closed]功能设计模式
【发布时间】:2012-07-05 13:55:57
【问题描述】:

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

【问题讨论】:

  • 它没有直接回答你的问题,但这个问题有一些有趣的信息(至少有一两个链接):stackoverflow.com/questions/327955/…
  • 您能否详细说明您认为 Typeclassopedia 没有很好涵盖的领域?
  • @dave4420 如果我从头到尾阅读 typeclassopedia,我读的越多,我理解的越少。第一部分非常好,但后面的部分对我来说很难读。
  • @KonstantinSolomatov 您可能需要研究您不理解的部分,查看博客文章并仔细查看代码。 typeclassopedia 中的所有这些“设计模式”都是真正的抽象,而且通常是很深的抽象,有时需要一段时间才能深入了解。
  • @DanBurton 不确定您是否误读了我的评论,但我会将所有这些归类为深度抽象,尽管当您听到“啊哈!”时很容易忘记这一点。时刻。

标签: scala haskell functional-programming monads


【解决方案1】:

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

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

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

我曾经读过一个关于creative uses of monads 的非常有趣的问题。建议的链接是关于该主题的精彩阅读。带着这种精神,我试着对arrows 提出同样的问题:我得到的答案肯定比关于 monads 的要少,但还是很有趣。


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

  1. Functional thinking: Functional design patterns, Part 1。在这里,它们涵盖了工厂、模板方法、策略、享元。底线是,通过将函数作为一等值,一切都变得更加简单。
  2. Functional thinking: Functional design patterns, Part 2。这是关于 java 和 groovy 的。它处理适配器模式。
  3. Functional thinking: Functional design patterns, Part 3。在这里,他们谈论解释器模式。同样,目标语言很时髦。

最相关的文章 w.r.t.你的问题肯定是第一个,但另外两个可能是有趣的相关阅读。

【讨论】:

  • 谢谢,但我指的是不同类型的模式,例如 Monad、Arrow、Applicative no GoF 模式。
  • @KonstantinSolomatov:我误解了你的问题,抱歉。我为单子和箭头添加了一些参考。
【解决方案2】:

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) 访问和更新。

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

【讨论】:

  • 是的,我读过这本书。我很喜欢它。不幸的是,它没有隐藏箭头和许多其他高级模式。我还想了解更多关于 Monads 和 Applicatives 的内容(例如,LYHGG 不包括 continuation monad)。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    在 Oleg 的网站上发布了很多 FP 的内容: http://okmij.org/ftp/

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

    【讨论】:

      【解决方案5】:

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

      http://manning.com/bjarnason/

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

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

      第三部分:功能设计模式

      1. 抽象案例
      2. 幺半群
      3. 函子
      4. 单子
      5. 应用函子
      6. 可遍历和可折叠的数据结构
      7. 单子

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-24
        • 2011-09-13
        • 2011-03-06
        • 2011-03-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多