另一个很好的学习资源(可能在中级水平),这对我帮助很大,并且没有't been mentioned in the other answers as far as I can see, is Brent Yorgey'的Typeclassopedia,可以在The Monad Reader (Issue 13)中找到
奖励'教程将为您提供帮助,让您为Real World Haskell带来的惊险刺激做好准备 . 祝你好运!
12
我建议加入#haskell irc channel并在那里提问 . 那个's how I learned Haskell. If you go through Real World Haskell as suggested above, real time answers to your questions will help greatly. Lots of smart people on #haskell write Haskell for fun and for profit, so you'会得到很多好的输入 . 试试吧!
10
These are my favoriteHaskell: Functional Programming with Types
Joeri van Eekelen, et al. | Wikibooks
Published in 2012, 597 pages
Real World Haskell
B. O'Sullivan, J. Goerzen, D. Stewart | OReilly Media, Inc.
Published in 2008, 710 pages
15 回答
这是一本可以在线阅读的好书:Real World Haskell
我所做的大多数Haskell程序都是为了解决Project Euler问题 .
我不久前读到的一条建议就是你应该有一套标准的简单问题,你知道如何解决(在理论上),然后每当你尝试学习一门新语言时,你就会用那种语言来实现这些问题 .
Graham Hutton的Programming in Haskell简洁,相当彻底,他多年的Haskell教学真的表现出来 . 这几乎总是我建议人们开始的,无论你从哪里开始 .
特别是,第8章("Functional Parsers")提供了开始处理monad所需的真正基础,我认为这是迄今为止最好的起点,其次是All About Monads . (关于那一章,请注意网站上的勘误表:但是如果没有一些特殊的帮助,你就不能使用
do
表格 . 你可能想先了解类型类并自己解决这个问题 . )Haskell初学者很少强调这一点,但是不仅要及早学习使用monad,而且要构建自己的monad . 这并不难,而定制的任务可以使许多任务变得更加简单 .
如果您只有使用命令式/ OO语言的经验,我建议使用更传统的函数式语言作为踏脚石 . Haskell真的与众不同,您必须了解许多不同的概念才能获得 . 我建议首先处理ML风格的语言(例如F#) .
要添加其他人的答案 - 有一个有用的可以帮助您编码时(例如解决项目Euler问题时): Hoogle . 您可以使用命令行界面或web interface .
命令行
安装Haskell平台后一定要
cabal install hoogle
Hoogle使用示例:
你有一个函数
f x = 3 * x + 1
,你想在(5 :: Int)
上应用它,然后将它应用于结果和结果,依此类推,并得到这些值的无限列表 . 您怀疑可能已经存在帮助您的功能(尽管不是专门用于您的f
) .该函数的类型为
(a -> a) -> a -> [a]
,如果需要f 5
或a -> (a -> a) -> [a]
,如果需要5 f
(我们假设该函数适用于一般类型,而不仅仅是Int
)是的,你需要的功能已经存在,它被称为
iterate
. 你按iterate func 5
使用它!Web界面
可以找到相同示例的结果here .
不要尝试用有趣的比喻阅读所有monad教程 . 它们会让你更加混乱 .
我很高兴看到使用Haskell的13集关于功能编程的系列剧 .
C9讲座:Erik Meijer博士 - 功能编程基础:http://channel9.msdn.com/shows/Going+Deep/Lecture-Series-Erik-Meijer-Functional-Programming-Fundamentals-Chapter-1/
我还可以推荐Yet Another Haskell Tutorial作为介绍 .
另一个很好的学习资源(可能在中级水平),这对我帮助很大,并且没有't been mentioned in the other answers as far as I can see, is Brent Yorgey'的Typeclassopedia,可以在The Monad Reader (Issue 13)中找到
它以非常易于访问的方式编写,并包含(以及许多其他内容),以下介绍性建议:
The Monad Reader本身是函数式程序员(不仅仅是Haskell程序员)的绝对宝库 .
第一个答案非常好 . 为了达到专家级别,您应该与一些专家自己一起攻读博士学位 .
我建议你访问Haskell页面:http://haskell.org . 在那里你有很多材料,并且很多参考Haskell社区批准的Haskell中最新的东西 .
尝试在其中编写简单的程序 .
您可以在各种教科书中找到示例任务 .
我不建议坚持使用Haskell / FP教科书,只是尝试用它做简单的事情:计算,字符串操作,文件访问 .
在我解决了十几个之后,我打破了冰:)
在那之后,阅读很多高级概念(Monads,Arrows,IO,递归数据结构),因为haskell是无限的,并且有很多 .
我确实认为通过实例实现Haskell的功能是最重要的开始 .
http://en.wikipedia.org/wiki/Haskell_98_features
这是棘手的类型,包括monad和箭头
http://www.haskell.org/haskellwiki/Typeclassopedia
对于现实问题和更大的项目,请记住这些标签:GHC(最常用的编译器),Hackage(libraryDB),Cabal(建筑系统),darcs(另一种建筑系统) .
集成系统可以节省您的时间:http://hackage.haskell.org/platform/
此系统的包数据库:http://hackage.haskell.org/
GHC编译器的维基:http://www.haskell.org/haskellwiki/GHC
在Haskell_98_features和Typeclassopedia之后,我想您已经可以自己找到并阅读有关它们的文档
顺便说一句,你可能想测试一些GHC的语言扩展,这可能是将来haskell标准的一部分 .
这是学习haskell的最好方法 . 我希望它可以帮助你 .
我的一些同事对Learn You a Haskell for Great Good!有很好的经验 .
并检查答案here
我建议你首先阅读BONUS' tutorial,然后阅读Real World Haskell (online for free) . 加入#Haskell IRC channel, on irc.freenode.com,并提出问题 . 这些人绝对是新手友好的,并且随着时间的推移帮助了我很多 . 此外,就在这里SO是一个很好的地方,可以得到你无法掌握的东西的帮助!尽量不要气馁,一旦点击,你的思绪就会被吹嘘 .
奖励'教程将为您提供帮助,让您为Real World Haskell带来的惊险刺激做好准备 . 祝你好运!
我建议加入#haskell irc channel并在那里提问 . 那个's how I learned Haskell. If you go through Real World Haskell as suggested above, real time answers to your questions will help greatly. Lots of smart people on #haskell write Haskell for fun and for profit, so you'会得到很多好的输入 . 试试吧!
These are my favorite Haskell: Functional Programming with Types
Real World Haskell
我将根据你在haskell中的技巧水平订购本指南,从绝对的初学者到专家 . 请注意,此过程需要几个月(几年?),所以它相当长 .
Absolute Beginner
首先,haskell能够胜任任何事情,具有足够的技能 . 它非常快(根据我的经验仅在c和c之后),可以用于从模拟到服务器,guis和web应用程序的任何事情 .
但是,有些问题比haskell更容易为haskell的初学者编写 . 数学问题和列表处理程序是很好的选择,因为它们只需要最基本的haskell知识才能编写 .
首先,学习haskell基础知识的一些好指南是happy learn haskell tutorial和learn you a haskell的前6章 . 阅读这些内容时,最好还是用你所知道的解决简单问题 .
另外两个好资源是Haskell Programming from first principles和Programming in Haskell . 他们都为每一章都附带练习,所以你有一些小的简单问题与你在最后几页学到的东西相匹配 .
一个很好的问题列表是haskell 99 problems page . 这些开始非常基础,并且随着你的继续变得更加困难 . 这很好的做法很多,因为它们让你练习递归和高阶函数的技能 . 我建议跳过任何需要随机性的问题,因为在haskell中这有点困难 . 如果您想使用QuickCheck测试解决方案,请检查this SO question(参见下面的中间步骤) .
一旦你完成了其中的一些,你就可以继续做一些Project Euler问题了 . 这些按照完成它们的人数排序,这是一个相当好的困难指示 . 这些测试你的逻辑和haskell比以前的问题更多,但你仍然应该能够做到前几个 . haskell具有这些问题的一大优势是整数不受大小限制 . 要完成其中的一些问题,阅读第7章和第8章,了解一个haskell是很有用的 .
Beginner
之后你应该对递归和更高阶函数有一个相当好的处理,所以现在是开始做一些更现实世界问题的好时机 . 一个非常好的起点是Real World Haskell(在线书籍,你也可以购买一份硬拷贝) . 我发现前几章对于从未完成函数式编程/使用过递归的人来说太快了 . 然而,通过练习以前遇到的问题,您应该会发现它完全可以理解 .
解决本书中的问题是学习如何在haskell中管理抽象和构建可重用组件的好方法 . 这对于习惯于面向对象(oo)编程的人来说至关重要,因为正常的oo抽象方法(oo类)没有出现在haskell中(haskell有类型类,但它们与oo类非常不同,更像是oo接口) . 我不认为跳过章节是个好主意,因为每个章节都引入了很多新的想法,这些想法将在后面的章节中使用 .
过了一会儿,你将进入第14章,可怕的monads章节(dum dum dummmm) . 由于概念的抽象程度,几乎所有学习haskell的人都难以理解monad . 如果在读完monad章节之后你不理解它们,我会感到气馁 . 我发现阅读monad的许多不同解释很有用;每个人都对这个问题提出了新的看法 . 这是一个非常好的list of monad tutorials . 我强烈推荐All About Monads,但其他人也很好 .
此外,概念需要一段时间才能真正沉入其中 . 这既可以通过使用,也可以通过时间来实现 . 我发现有时睡在一个问题上比其他任何事情更有帮助!最终,这个想法会点击,你会想知道为什么你很难理解一个实际上非常简单的概念 . 当这种情况发生时很棒,当它发生时,你可能会发现haskell是你最喜欢的命令式编程语言:)
为了确保您完全理解Haskell类型系统,您应该尝试解决20 intermediate haskell exercises . 这些练习使用有趣的"furry"和"banana"等函数名称,如果你还没有它们,可以帮助你很好地理解一些基本的函数式编程概念 . 晚上用箭头,独角兽,香肠和毛茸茸的香蕉覆盖的纸张清单的好方法 .
Intermediate
一旦你理解了Monads,我认为你已经从初学者haskell程序员转变为中级haskeller . 那么从哪里开始呢?我建议的第一件事(如果你还没有从学习monad中学到它们)是各种类型的monad,例如Reader,Writer和State . 再一次,真实的世界haskell和所有关于monads给予了很好的报道 . 要完成你的monad训练,学习monad变形金刚是必须的 . 这些让你将不同类型的Monads(例如Reader和State monad)组合成一个 . 这可能看起来没什么用,但是在使用它们一段时间之后你会想知道没有它们你是如何生活的 .
现在,如果你愿意,你可以完成现实世界的哈斯克书 . 现在跳过章节并不重要,只要你有monads拍下来 . 只需选择您感兴趣的内容即可 .
凭借您现在拥有的知识,您应该能够使用cabal上的大多数软件包(至少是文档中的那些软件包),以及haskell附带的大多数库 . 要尝试的有趣库列表如下:
Parsec:用于解析程序和文本 . 比使用正则表达式好多了 . 优秀的文档,还有一个现实世界的haskell章节 .
Quickcheck:一个非常酷的测试程序 . 你所做的是写一个应该永远为真的谓词(例如
length (reverse lst) == length lst
) . 然后,您将谓词传递给quickCheck,它将生成许多随机值(在本例中为列表)并测试谓词对于所有结果都为真 . 另见online manual .HUnit:haskell中的单元测试 .
gtk2hs:haskell最流行的gui框架,让你在haskell中编写gtk应用程序 .
happstack:haskell的Web开发框架 . 不使用数据库,而是使用数据类型存储 . 非常好的文档(其他流行的框架将是snap和yesod) .
此外,您应该最终学习许多概念(如Monad概念) . 这比第一次学习Monads更容易,因为你的大脑将用于处理所涉及的抽象级别 . 学习这些高级概念以及它们如何组合在一起的非常好的概述是Typeclassopedia .
Applicative:像Monads这样的界面,但不那么强大 . 每个Monad都是适用的,但反之亦然 . 这很有用,因为有些类型是Applicative但不是Monads . 此外,使用Applicative函数编写的代码通常比使用Monad函数编写等效代码更具组合性 . 请参阅“了解你的哈克尔指南”中的Functors, Applicative Functors and Monoids .
Foldable,Traversable:抽象列表的许多操作的类型类,以便相同的函数可以应用于其他容器类型 . 另见haskell wiki explaination .
Monoid:Monoid是一个具有零(或mempty)值的类型,以及一个将两个Monoid连接在一起的操作,标记为
<>
,例如x <> mempty = mempty <> x = x
和x <> (y <> z) = (x <> y) <> z
. 这些被称为身份和相关性法律 . 许多类型都是Monoids,例如数字,有mempty = 0
和<> = +
. 这在许多情况下都很有用 .Arrows:箭头是表示采用输入并返回输出的计算的一种方式 . 函数是最基本的箭头类型,但还有许多其他类型 . 该库还具有许多非常有用的操作箭头的功能 - 即使仅用于普通的旧的haskell功能,它们也非常有用 .
Arrays:haskell中的各种可变/不可变数组 .
ST Monad:允许您编写具有可变状态的代码,该状态可以非常快速地运行,同时在monad之外仍保持纯粹 . 请参阅链接查看更多细节 .
FRP:功能反应式编程,一种编写处理事件,触发器,输入和输出(例如gui)的代码的新的实验性方法 . 我不太了解这个 . Paul Hudak's talk about yampa是一个好的开始 .
你应该看一下很多新的语言功能 . 我只是列出它们,你可以从谷歌,haskell wikibook,haskellwiki.org网站和ghc documentation找到很多关于它们的信息 .
多参数类型类/函数依赖项
类型系列
存在量化类型
幻影类型
GADTS
其他人......
很多haskell都是基于category theory,所以你可能想要研究一下 . 一个很好的起点是Category Theory for Computer Scientist . 如果你没有't want to buy the book, the author'相关article也很出色 .
最后,您需要了解有关各种haskell工具的更多信息 . 这些包括:
ghc(及其所有功能)
cabal:haskell包系统
darcs:用haskell编写的分布式版本控制系统,非常受haskell程序的欢迎 .
haddock:一个haskell自动文档生成器
在学习所有这些新的库和概念时,在haskell中编写一个中等大小的项目非常有用 . 它可以是任何东西(例如小游戏,数据分析器,网站,compiler) . 通过这项工作,您可以应用许多您正在学习的内容 . 你可以长时间呆在这个级别(这就是我所处的位置) .
Expert
你需要几年时间才能进入这个阶段(你好,从2009年开始!),但是从这里我猜你开始写博士论文,新的ghc扩展,并提出新的抽象 .
Getting Help
最后,在学习的任何阶段,有多个获取信息的地方 . 这些是:
#haskell irc渠道
mailing lists . 这些值得注册只是为了阅读发生的讨论 - 有些非常有趣 .
在haskell.org主页上列出的其他地方
Conclusion
好吧,这比我预期的要长......无论如何,我认为精通haskell是一个非常好的主意 . 这需要很长时间,但这主要是因为你正在学习一种全新的思维方式 . 它不像学习java后学习ruby,而是像学习c之后学习java一样 . 此外,我发现由于学习haskell,我的面向对象编程技能得到了提高,因为我看到了很多抽象思路的新方法 .