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