我一直在逐渐学习Haskell,甚至觉得我有一堆monad。然而,仍然有很多我不太理解的异国情调,比如Arrows,Applicative等。虽然我从Haskell代码中汲取了点点滴滴,但我找到了一个真正解释的教程会很好他们完全。 (似乎有几十个关于monad的教程......但是之后一切似乎都完成了!)
答案 0 :(得分:54)
以下是在“掌握”monad之后我发现有用的一些资源:
最重要的是,深入了解您自己使用的任何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)
像Monad
,Applicative
,Arrow
,Functor
这样的类型游戏非常棒,而且更好地改变了对代码的看法,而不仅仅是方便了功能通用于他们。但是有一个常见的误解,即Haskell的“下一步”是学习更多类型类和构造控制流的方法。下一步是决定你想写什么,并尝试编写它,探索你需要的东西。
即使您了解Monads,这并不意味着您已经触及了使用单一结构化代码可以做的事情。使用解析器组合库,或编写自己的库。探索为什么适用符号有时对他们来说更容易。探索为什么限制自己适应解析器可能更有效。
查看逻辑或数学问题并探索实现回溯的方法 - 深度优先,广度优先等。探索ListT与LogicT和ChoiceT之间的区别。看一下延续。
或做一些完全不同的事情!
答案 3 :(得分:4)
你可以做的最重要的事情是探索更多Hackage。克服Haskell的各种异域特性可能会让您找到针对某些问题的改进解决方案,而Hackage上的库将大大扩展您的工具集。
关于Haskell生态系统的最佳部分是,您可以通过学习如何使用Hackage上可用的巨型嗡嗡声锯来平衡学习手术精确的新抽象技术。
答案 4 :(得分:4)
开始编写代码。你可以随时学习必要的概念。
除了语言之外,要有效地使用Haskell,您需要学习一些真实的工具和技术。需要考虑的事项:
*) 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编译器: - )。