功能设计模式

Kon*_*tov 106 monads haskell functional-programming scala

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

Edm*_*984 35

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

http://manning.com/bjarnason/

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

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

第三部分:功能设计模式

  1. 抽象的情况
  2. 函子
  3. 单子
  4. 适用的仿函数
  5. 可移动和可折叠的数据结构
  6. Comonads

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

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


Ric*_* T. 31

对不起,我不知道哪些文章或书籍详细介绍了所有这些结构的不同用法,但我可以给你一些个人资源的链接.

一个非常常见的模式是构建monad变换器而不是简单的monad(参见下一段中的链接).它基本上意味着你构建了必须与其他monad组合的东西,导致更复杂的一个能够处理它们的功能.

真实世界Haskell中有一些关于monad的章节.在第14章中,作者解释了基础知识和一些常见用法(可能是列表,状态).第15章使用monad进行编程提供了有关如何有效使用它们的更多解释(它也涵盖了读者monad).下一章解释了如何使用Parsec,但搜索包含它实际工作原理的文章可能更有趣:它应该是组织良好地使用monads进行解析的一个很好的例子.Fianlly,第18章 .Monad 变形金刚介绍monad变换器如何工作,然后逐步展示如何构建一个变换器.对本章最后部分的考虑也很有趣.

我曾经读过一篇关于monad创造性使用的非常有趣的问题.建议的链接是关于该主题的精彩读物.凭借这种精神,我试图向箭头问相同:我肯定得到的答案少于单子上的答案,但有趣的是.


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

  1. 功能性思维:功能设计模式,第1部分.在这里,他们涵盖工厂,模板方法,战略,轻量级.最重要的是,通过将函数作为第一类值,一切都更简单.
  2. 功能性思维:功能设计模式,第2部分.这是关于java和groovy.它解决了适配器模式.
  3. 功能性思维:功能设计模式,第3部分.他们在这里谈论翻译模式.同样,目标语言是常规的.

最相关的文章是你的问题肯定是第一个,但其他两个可能是有趣的相关读数.


pig*_*ker 18

Jeremy Gibbons 在FP博客中有一个模式,最终注定要成为你所要求的书.当然,现在还没有达到你想要的那样有用的条件,但他值得一些鼓励!

与此同时,我会说Brent Yorgey的Typeclassopedia +1.它真的很有用,如果后来的部分混乱,这个网站是一个很好的地方,可以找到它们的底部.我知道布伦特正在审查它.如果他没有联系到他的读者,请给他一些帮助.


And*_*yuk 9

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

关于来自Josh Suereth的FP模式的演讲:http://jsuereth.com/intro-to-fp/


Chr*_*lor 5

你有没有读过为了好大学学习哈斯克尔的后续章节?

  • 第6章介绍了地图和折叠,它们是功能语言中两个比较重要的"设计模式".

  • 第11-13章按顺序包括Functors,Applicative Functors和Monads.这很有用 - 许多教程介绍Functors然后Monads,然后在最后添加Applicative Functors(如果它们完全覆盖它).LYAH中的顺序更好,因为从Functors移动=> Applicative Functors => Monads会让你逐渐走上普遍性和权力的阶梯.

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

它不包括Arrows或Comonads,它们是Haskell中更高级的主题.要了解如何以及为何使用Arrows或Comonads,你肯定应该牢牢掌握Monads,所以我认为这不是问题--LYAH坚定地瞄准Haskell市场的初学者.