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

什么';monads之后学习Haskell的下一步是什么?,haskell,Haskell,我一直在逐渐学习哈斯克尔,甚至觉得自己掌握了单子的窍门。然而,还有很多我几乎不懂的异国情调,比如箭头、应用程序等等。虽然我从我所看到的Haskell代码中挑选了一些片段,但如果能找到一个真正完整地解释它们的教程,那就太好了。(关于Monad的教程似乎有几十个……但之后一切似乎马上就结束了!)编写一个haskell编译器:-)。类型类,如Monad,Applicative,Arrow,Functor,都很棒,对于改变您对代码的看法来说,这甚至比让通用函数覆盖它们更方便。但有一种常见的误解,即Has

我一直在逐渐学习哈斯克尔,甚至觉得自己掌握了单子的窍门。然而,还有很多我几乎不懂的异国情调,比如箭头、应用程序等等。虽然我从我所看到的Haskell代码中挑选了一些片段,但如果能找到一个真正完整地解释它们的教程,那就太好了。(关于Monad的教程似乎有几十个……但之后一切似乎马上就结束了!)

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

类型类,如
Monad
Applicative
Arrow
Functor
,都很棒,对于改变您对代码的看法来说,这甚至比让通用函数覆盖它们更方便。但有一种常见的误解,即Haskell的“下一步”是学习更多类型类和构造控制流的方法。下一步是决定你想写什么,并尝试写下来,探索你需要什么

即使您理解monad,也不意味着您已经了解了monadic结构化代码的基本功能。使用解析器组合器库,或者编写自己的。探索为什么应用符号有时对他们来说更容易。探索将自己局限于应用程序解析器可能更有效的原因

观察逻辑或数学问题,探索实现回溯的方法——深度优先、广度优先等。探索ListT、LogicT和ChoiceT之间的差异。看一看连续体


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

您知道编写代码所需的一切。但是,如果您想了解更多Haskell-y方面的知识,我可以建议您:

  • 类型族。非常方便的功能。它基本上为您提供了一种在类型级别编写函数的方法,当您试图以非常精确的方式编写参数为多态性的函数时,这种方法非常方便。例如:

数据TTrue=TTrue
数据FFalse=FFalse

类TypeLevelIf tf a b where 输入如果TFA b 古怪的陈述:tf->a->b->tf a b

实例TypeLevelIf t真的是a b,其中 如果t真的a b=a,则键入 古怪的陈述t真实的a b=a

实例TypeLevelIf FFalse a b其中 如果FFalse a b=b,则输入 weirdIfStatement FFalse a b=a

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

如果您对类型级编程感兴趣,那么类型族提供了一种进入此主题的途径

  • 哈斯克尔。这是一个巨大的课题。它提供了与C中的宏类似的功能,但具有更大的类型安全性

  • 了解一些领先的Haskell库。我无法计算有多少次parsec让我能够快速编写一个非常有用的实用程序。dons定期发布hackage;上流行的库列表


你能做的最重要的事情就是探索更多的黑客行为。与Haskell的各种奇特特性进行斗争可能会让您找到某些问题的改进解决方案,而Hackage上的库将极大地扩展您的工具集


Haskell生态系统最棒的部分是,您可以在学习外科精确的新抽象技术与学习如何使用Hackage上可用的巨大buzz锯之间取得平衡。

开始编写代码。您将在学习过程中学习必要的概念

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

  • ,一种用于管理依赖关系、构建和部署Haskell应用程序的工具*
  • FFI(外部函数接口)使用Haskell代码**中的C库
  • 作为他人图书馆的来源
  • 如何
  • 自动测试框架(QuickCheck、HUnit)
*)有助于快速启动


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

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

  • 正如SuperBloup所指出的,布伦特·约基(Brent Yorgey)的是不可或缺的(事实上它涵盖了箭头)
  • 其中有很多伟大的东西可以被认为是“在monad之后”:例如,应用程序解析、monad转换器和STM
  • 约翰·休斯的书是一个很好的资源,它教会了我很多关于单子的知识,正如它教会了我关于箭的知识一样(尽管我认为我在读它的时候已经理解了单子)
  • 本文是对函数式反应式编程的一个很好的介绍
  • 关于类型族:我发现与它们一起工作比阅读它们更容易。这个包是一个开始,或者你可以看看Oleg Kiselyov和Ken Shan的代码
  • 选择Chris Okasaki的几章,并详细阅读
  • Raymond Smullyan的是一个非常容易理解的组合逻辑入门,它将改变你写Haskell的方式
  • 读一下杰拉德·休特的书。代码是OCaml,但在处理类似的文件时,能够在头脑中将OCaml转换为Haskell是很有用的(也不是很难)

最重要的是,深入研究您发现自己正在使用的任何黑客库的代码。如果他们正在使用语法、习惯用法或扩展进行一些您不理解的操作,请查找。

关于类型类:

  • Applicative
    实际上比
    Monad
    简单。我最近在其他地方说过,但要点是关于增强的
    Functor
    s,您可以将函数提升到其中。要了解
    Applicative
    ,您可以尝试在不使用
    do
    符号的情况下使用编写一些东西——我的经验是,对于简单的解析器来说,Applicative样式比monadic更有效。

  • 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