首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >学习Haskell的下一步是什么?

学习Haskell的下一步是什么?
EN

Stack Overflow用户
提问于 2010-07-14 22:43:16
回答 7查看 3.3K关注 0票数 33

我一直在逐步学习Haskell,甚至觉得我已经掌握了monads的诀窍。然而,仍然有许多更奇特的东西我几乎不懂,像箭头,应用程序等。虽然我正在从我见过的Haskell代码中挑选一些零碎的东西,但如果能找到一个真正完整地解释它们的教程,那将是一件好事。(似乎有许多关于monad的教程..但一切似乎都会在那之后直接结束!)

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-07-15 00:30:59

以下是我在“掌握”monads的诀窍后发现的一些有用的资源:

  • 正如SuperBloup所指出的,Brent Yorgey的Typeclassopedia是不可或缺的(事实上,它确实涵盖了Real World Haskell中大量可以被认为是“monad之后”的伟大东西:应用程序解析、monad转换器和STM,例如,
  • John Hughes的"Generalizing Monads to Arrows"是一个很好的资源,它教会了我关于monads和箭头的同样多的知识(尽管当我读到它的时候,我认为我已经理解了monads )。
  • "Yampa Arcade"论文是一篇很好的介绍Functional Reactive monads类型家族的文章:我发现使用它们比阅读关于它们的知识更容易。vector-space包是一个开始的地方,或者您可以查看Oleg Kiselyov和Ken Shan的代码Chris Okasaki的Purely Functional Data Structures的几个章节,并在Haskell.
  • Read Smullyan的Functional Pearl on zippers是一个奇妙的组合逻辑介绍,它将改变您编写detail.
  • Raymond Gérard To Mock a MockingbirdFunctional Pearl on zippers的方式。代码是OCaml的,但在阅读这样的论文时,能够在头脑中将OCaml转换为Haskell是很有用的(而且不是太难)。

最重要的是,深入研究您发现自己正在使用的任何Hackage库的代码。如果他们在做一些你不理解的语法、习惯用法或扩展,可以查一下。

票数 56
EN

Stack Overflow用户

发布于 2010-07-15 05:30:16

关于类型类:

  • Applicative实际上比Monad更简单。我最近在其他地方提到了a few things about it,但要点是它是关于增强的Functor,您可以在其中提升函数。要了解Applicative,您可以尝试使用编写代码,而不使用do表示法--我的经验是,应用程序风格比一元式更有效,因为简单的sort是一种非常抽象的方式,可以处理类似于函数的东西(类型之间的“箭头”)。它们可能很难让你明白,直到你偶然发现了一些本质上是Arrow-like的东西。在编写带有反馈循环的交互式状态机时,我一度重塑了Control.Arrow的一半(差劲)。
  • 你没有提到它,但一个经常被低估、功能强大的类型类是不起眼的Monoid。有很多地方可以找到类么半群结构。例如,看看monoids package

除了类型类之外,我会提供一个非常简单的答案来回答你的问题:编写程序!最好的学习方法是通过实践,所以选择一些有趣或有用的东西,然后让它发生。

事实上,许多更抽象的概念--比如Arrow--可能会更有意义,如果您稍后再来看它们,并发现它们为您遇到但甚至没有意识到可以抽象出来的问题提供了一个整洁的解决方案。

但是,如果您想要实现特定的目标,为什么不看一下Functional Reactive Programming--这是一系列很有前途的技术,但是对于最好的方法是什么,还有很多悬而未决的问题。

票数 9
EN

Stack Overflow用户

发布于 2010-07-14 23:09:36

MonadApplicativeArrowFunctor这样的类型类都很棒,甚至比函数泛型带来的便利更能改变你对代码的看法。但有一种普遍的误解,认为Haskell的“下一步”是学习更多的类型类和结构化控制流的方法。下一步是决定你想要写什么,并试着写出来,探索你需要的东西。

即使您了解Monads,这也不意味着您已经触及了monadically结构化代码所能做的事情的皮毛。尝试使用解析器组合器库,或者编写自己的解析器组合器库。探索为什么应用符号有时对他们来说更容易。探索为什么限制自己使用应用型解析器可能更有效。

查看逻辑或数学问题,探索实现回溯的方法--深度优先、广度优先等。探索ListT与LogicT和ChoiceT之间的区别。看一下continuations。

或者做一些完全不同的事情!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3247280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档