Haskell入门

时间:2009-06-18 13:17:11

标签: haskell functional-programming

几天后,我试图围绕Haskell中的函数式编程范例。我通过阅读教程和观看截屏视频来完成这项工作,但似乎并没有真正坚持下去。 现在,在学习各种命令式/ OO语言(如C,Java,PHP)时,练习对我来说是个好方法。但由于我不知道Haskell能够做什么,而且因为有许多新概念可供使用,我还不知道从哪里开始。

那么,你是如何学习Haskell的?是什么让你真正“打破僵局”?还有开始练习的好主意吗?

15 个答案:

答案 0 :(得分:2408)

答案 1 :(得分:175)

我的一位同事对Learn You a Haskell for Great Good!有很好的经验。

  

针对有人的教程   在命令式编程方面的经验   语言,但没有编程   以前的功能语言。

并检查答案here

答案 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 5a -> (a -> a) -> [a],那么该函数的类型为5 f(我们假设该函数适用于一般类型,而不仅仅是{{}} Int 1}} S)

$ hoogle "a -> (a -> a) -> [a]"
Prelude iterate :: (a -> a) -> a -> [a]

是的,你需要的功能已经存在,它被称为iterate。你可以iterate func 5使用它!

Web界面

可以找到相同示例的结果here

答案 5 :(得分:56)

格雷厄姆赫顿的Programming in Haskell简明扼要,相当彻底,他多年的教学实践表明了哈斯克尔。这几乎总是我建议人们开始的,不管你从哪里开始。

特别是,第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黑客的智慧有两个关键:

     
      
  1. 了解类型。

  2.   
  3. 对每个类型及其与其他类型的关系获得深刻的直觉   类型类,熟悉许多例子。

  4.   

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中最新的东西。