在monads之后学习Haskell的下一步是什么?

时间:2010-07-14 14:43:16

标签: haskell

我一直在逐渐学习Haskell,甚至觉得我有一堆monad。然而,仍然有很多我不太理解的异国情调,比如Arrows,Applicative等。虽然我从Haskell代码中汲取了点点滴滴,但我找到了一个真正解释的教程会很好他们完全。 (似乎有几十个关于monad的教程......但是之后一切似乎都完成了!)

9 个答案:

答案 0 :(得分:54)

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

  • 正如SuperBloup指出的那样,Brent Yorgey的Typeclassopedia是不可或缺的(事实上它确实涵盖了箭头)。
  • Real World Haskell中有很多很棒的东西可以被认为是“monads之后”:例如,应用解析,monad变换器和STM。
  • John Hughes的"Generalizing Monads to Arrows"是一个很好的资源,它教会了我关于monads的内容和它关于箭头的内容(尽管我认为我在阅读时已经理解了monad)。
  • "Yampa Arcade"论文是对功能反应式编程的一个很好的介绍。
  • 关于类型家庭:我发现与他们合作比阅读他们更容易。 vector-space包是一个可以开始的地方,或者您可以查看Oleg Kiselyov和Ken Shan course on Haskell and natural language semantics的代码。
  • 选择Chris Okasaki Purely Functional Data Structures的几个章节并详细解读。
  • Raymond Smullyan的To Mock a Mockingbird是一个非常容易理解的组合逻辑介绍,它将改变你编写Haskell的方式。
  • 阅读GérardHuet的Functional Pearl on zippers。代码是OCaml,但是在处理这样的论文时能够将OCaml转换为Haskell是有用的(并且不是太困难)。

最重要的是,深入了解您自己使用的任何Hackage库的代码。如果他们正在做一些您不理解的语法或习语或扩展,请查阅。

答案 1 :(得分:10)

关于类型类:

  • Applicative实际上比Monad更简单。我最近在其他地方说过a few things about it,但要点是它是关于增强Functor s,你可以将功能提升到。要了解Applicative,您可以尝试使用Parsec编写内容而不使用do符号 - 我的经验是,应用风格比monadic更好用对于直截了当的解析器。

  • Arrow是一种非常抽象的处理类似函数的方法(类型之间的“箭头”)。在你偶然发现自然Arrow之类的东西之前,你可能很难理解。有一次,我在编写带有反馈循环的交互式状态机时重新发明了Control.Arrow(差)的一半。

  • 你没有提到它,但是一个经常被低估,强大的类型类是卑微的Monoid。有 lot 的地方可以找到类似幺半群的结构。例如,查看monoids package


除了类型课程,我还会为您的问题提供一个非常简单的答案:编写程序!最好的学习方法是做,所以选择一些有趣或有用的东西,让它发生

事实上,许多更抽象的概念 - 比如Arrow - 可能会更有意义,如果你以后回到它们并发现,像我一样,它们为你提供了一个整洁的解决方案已经遇到但甚至没有意识到可以被抽象出来。

然而,如果你想要特定的东西拍摄,为什么不看看Functional Reactive Programming - 这是一系列有很多承诺的技术,但是有很多未解决的问题最好的方法是。

答案 2 :(得分:4)

MonadApplicativeArrowFunctor这样的类型游戏非常棒,而且更好地改变了对代码的看法,而不仅仅是方便了功能通用于他们。但是有一个常见的误解,即Haskell的“下一步”是学习更多类型类和构造控制流的方法。下一步是决定你想写什么,并尝试编写它,探索你需要的东西。

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

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

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

答案 3 :(得分:4)

你可以做的最重要的事情是探索更多Hackage。克服Haskell的各种异域特性可能会让您找到针对某些问题的改进解决方案,而Hackage上的库将大大扩展您的工具集。

关于Haskell生态系统的最佳部分是,您可以通过学习如何使用Hackage上可用的巨型嗡嗡声锯来平衡学习手术精确的新抽象技术。

答案 4 :(得分:4)

开始编写代码。你可以随时学习必要的概念。

除了语言之外,要有效地使用Haskell,您需要学习一些真实的工具和技术。需要考虑的事项:

  • Cabal,一个管理依赖关系,构建和部署Haskell应用程序的工具 *
  • FFI(外部函数接口)使用Haskell代码中的C库 **
  • Hackage作为其他人图书馆的来源。
  • 如何profile and optimize
  • 自动测试框架(QuickCheck,HUnit)。

*) cabal-init有助于快速启动。

**)目前,我最喜欢的FFI绑定工具是bindings-DSL

答案 5 :(得分:4)

作为单一的下一步(而不是六个“后续步骤”),我建议您学习编写自己的类型类。这里有几个简单的问题可以帮助您入门:

  • 为QuickCheck编写一些有趣的实例声明。比如说你想要生成某种“有趣”的随机树。

  • 转到以下小问题:定义函数/\\/complement(“和”,“或”,&“not”)不仅可以应用于布尔人,还可以应用于任意arity的谓词。 (如果你仔细观察,你可以在SO上找到这个答案。)

答案 6 :(得分:3)

你知道你需要出去编写代码。但如果你正在寻找更多Haskell-y的东西要学习,我可以建议:

  • 键入系列。非常方便的功能。它基本上为您提供了一种在类型级别上编写函数的方法,当您尝试以非常精确的方式编写参数是多态的函数时,这很方便。一个这样的例子:

data TTrue = TTrue
data FFalse = FFalse

class TypeLevelIf tf a b where type If tf a b weirdIfStatement :: tf -> a -> b -> tf a b

instance TypeLevelIf TTrue a b where type If TTrue a b = a weirdIfStatement TTrue a b = a

instance TypeLevelIf FFalse a b where type If FFalse a b = b weirdIfStatement FFalse a b = a

这为您提供了一个行为类似于if语句的函数,但能够根据给定的真值返回不同的类型。

如果您对类型级编程感到好奇,那么类型族就可以为这个主题提供一个途径。

  • 模板Haskell。这是一个很大的主题。它为您提供类似于C中的宏的功能,但具有更多的类型安全性。

  • 了解一些领先的Haskell库。我无法计算parsec让我快速编写一个非常有用的实用程序的次数。 dons定期发布一个关于hackage的流行图书馆列表; check it out

答案 7 :(得分:2)

答案 8 :(得分:0)

编写一个haskell编译器: - )。