几天后,我试图围绕Haskell中的函数式编程范例。我通过阅读教程和观看截屏视频来完成这项工作,但似乎并没有真正坚持下去。 现在,在学习各种命令式/ OO语言(如C,Java,PHP)时,练习对我来说是个好方法。但由于我不知道Haskell能够做什么,而且因为有许多新概念可供使用,我还不知道从哪里开始。
那么,你是如何学习Haskell的?是什么让你真正“打破僵局”?还有开始练习的好主意吗?
答案 0 :(得分:2408)
答案 1 :(得分:175)
答案 2 :(得分:101)
这是一本很好的书,你可以在网上阅读:Real World Haskell
我所做的大多数Haskell程序都是为了解决Project Euler个问题。
我不久前读到的一条建议就是你应该有一套标准的简单问题,你知道如何解决(理论上),然后每当你尝试学习一门新语言时,你都会用那种语言来实现这些问题。
答案 3 :(得分:71)
我很高兴看到使用Haskell的13集关于功能编程的系列剧。
C9讲座:Erik Meijer博士 - 功能编程基础: http://channel9.msdn.com/shows/Going+Deep/Lecture-Series-Erik-Meijer-Functional-Programming-Fundamentals-Chapter-1/
答案 4 :(得分:69)
要添加其他人的答案 - 在编码时有一个有用的帮助(例如解决项目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
1}} S)
$ hoogle "a -> (a -> a) -> [a]"
Prelude iterate :: (a -> a) -> a -> [a]
是的,你需要的功能已经存在,它被称为iterate
。你可以iterate func 5
使用它!
可以找到相同示例的结果here。
答案 5 :(得分:56)
特别是,第8章(“功能解析器”)提供了开始处理monad所需的真正基础,我认为这是迄今为止最好的起点,其次是All About Monads。 (关于那一章,请注意网站上的勘误表:但是如果没有一些特殊的帮助,你就不能使用do
表格。你可能想先了解类型类并解决这个问题。你自己的。)
Haskell初学者很少强调这一点,但是不仅要及早学习使用monad,而且要构建自己的monad。这并不难,而定制的任务可以使许多任务变得更加简单。
答案 6 :(得分:51)
不要尝试用有趣的比喻阅读所有monad教程。它们会让你更加混乱。
答案 7 :(得分:31)
我建议加入#haskell irc channel并在那里提问。这就是我学习Haskell的方式。如果您按照上面的建议浏览Real World Haskell,那么实时回答您的问题将会有很大帮助。 #haskell上的很多聪明人写Haskell是为了娱乐和赚钱,所以你会得到很多好的输入。试试吧!
答案 8 :(得分:24)
这些是我最喜欢的
<强> Haskell: 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
答案 9 :(得分:19)
我还可以推荐Yet Another Haskell Tutorial作为介绍。
另一个很好的学习资源(可能是在中级水平),这对我帮助很大,而且在我看到的其他答案中没有提到,是Brent Yorgey的 Typeclassopedia ,可以在The Monad Reader (Issue 13)
中找到它以非常易于理解的风格编写,并包含(以及其他许多内容),以下介绍性建议:
专家Haskell黑客的智慧有两个关键:
了解类型。
- 醇>
对每个类型及其与其他类型的关系获得深刻的直觉 类型类,熟悉许多例子。
The Monad Reader本身就是函数式程序员(不仅仅是Haskell程序员)的绝对宝库。
答案 10 :(得分:14)
尝试在其中编写简单的程序。
您可以在各种教科书中找到示例任务。
我不建议坚持使用Haskell / FP教科书,只是尝试用它做简单的事情:计算,字符串操作,文件访问。
在我解决了十几个之后,我打破了冰。:)
之后,阅读很多关于高级概念(Monads,Arrows,IO,递归数据结构)的内容,因为haskell是无限的,并且有很多概念。
答案 11 :(得分:14)
我认为通过示例实现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标准的一部分。
这是学习哈斯克尔的最好方法。我希望它可以帮到你。
答案 12 :(得分:13)
我建议您首先阅读BONUS' tutorial,然后阅读Real World Haskell (online for free)。加入#Haskell IRC channel, on irc.freenode.com,并提出问题。这些人绝对是新手友好的,并且随着时间的推移帮助了我很多。此外,就在这里SO是一个很好的地方,可以帮助你无法掌握的东西!尽量不要气馁,一旦点击,你的思绪就会被摧毁。
BONUS'教程将为您做好准备,让您为Real World Haskell带来的惊险刺激做好准备。祝你好运!
答案 13 :(得分:12)
如果您只有使用命令式/ OO语言的经验,我建议使用更传统的功能语言作为踏脚石。 Haskell 真的不同,你必须了解很多不同的概念才能到达任何地方。我建议首先处理ML风格的语言(比如F#)。
答案 14 :(得分:10)
第一个答案非常好。为了达到专家级别,你应该与一些专家自己一起攻读博士学位。
我建议你访问Haskell页面:http://haskell.org。在那里,您有很多材料,并且很多参考Haskell社区批准的Haskell中最新的东西。