首页 文章

Haskell入门

提问于
浏览
757

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

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

15 回答

  • 19

    这是一本可以在线阅读的好书:Real World Haskell

    我所做的大多数Haskell程序都是为了解决Project Euler问题 .

    我不久前读到的一条建议就是你应该有一套标准的简单问题,你知道如何解决(在理论上),然后每当你尝试学习一门新语言时,你就会用那种语言来实现这些问题 .

  • 24

    Graham Hutton的Programming in Haskell简洁,相当彻底,他多年的Haskell教学真的表现出来 . 这几乎总是我建议人们开始的,无论你从哪里开始 .

    特别是,第8章("Functional Parsers")提供了开始处理monad所需的真正基础,我认为这是迄今为止最好的起点,其次是All About Monads . (关于那一章,请注意网站上的勘误表:但是如果没有一些特殊的帮助,你就不能使用 do 表格 . 你可能想先了解类型类并自己解决这个问题 . )

    Haskell初学者很少强调这一点,但是不仅要及早学习使用monad,而且要构建自己的monad . 这并不难,而定制的任务可以使许多任务变得更加简单 .

  • 14

    如果您只有使用命令式/ OO语言的经验,我建议使用更传统的函数式语言作为踏脚石 . Haskell真的与众不同,您必须了解许多不同的概念才能获得 . 我建议首先处理ML风格的语言(例如F#) .

  • 14

    要添加其他人的答案 - 有一个有用的可以帮助您编码时(例如解决项目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

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

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

    Web界面

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

  • 100

    不要尝试用有趣的比喻阅读所有monad教程 . 它们会让你更加混乱 .

  • 174

    我很高兴看到使用Haskell的13集关于功能编程的系列剧 .

    C9讲座:Erik Meijer博士 - 功能编程基础:http://channel9.msdn.com/shows/Going+Deep/Lecture-Series-Erik-Meijer-Functional-Programming-Fundamentals-Chapter-1/

  • 51

    我还可以推荐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)中找到

    它以非常易于访问的方式编写,并包含(以及许多其他内容),以下介绍性建议:

    专家Haskell黑客的智慧有两个关键:理解类型 . 通过熟悉许多示例,可以为每个类型及其与其他类型类的关系获得深刻的直觉 .

    The Monad Reader本身是函数式程序员(不仅仅是Haskell程序员)的绝对宝库 .

  • 31

    第一个答案非常好 . 为了达到专家级别,您应该与一些专家自己一起攻读博士学位 .

    我建议你访问Haskell页面:http://haskell.org . 在那里你有很多材料,并且很多参考Haskell社区批准的Haskell中最新的东西 .

  • 13

    尝试在其中编写简单的程序 .

    您可以在各种教科书中找到示例任务 .

    我不建议坚持使用Haskell / FP教科书,只是尝试用它做简单的事情:计算,字符串操作,文件访问 .

    在我解决了十几个之后,我打破了冰:)

    在那之后,阅读很多高级概念(Monads,Arrows,IO,递归数据结构),因为haskell是无限的,并且有很多 .

  • 2370

    我确实认为通过实例实现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的最好方法 . 我希望它可以帮助你 .

  • 68

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

    教程针对的是那些具有命令式编程语言经验但之前没有使用函数式语言编程的人 .

    并检查答案here

  • 55

    我建议你首先阅读BONUS' tutorial,然后阅读Real World Haskell (online for free) . 加入#Haskell IRC channel, on irc.freenode.com,并提出问题 . 这些人绝对是新手友好的,并且随着时间的推移帮助了我很多 . 此外,就在这里SO是一个很好的地方,可以得到你无法掌握的东西的帮助!尽量不要气馁,一旦点击,你的思绪就会被吹嘘 .

    奖励'教程将为您提供帮助,让您为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 favorite 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
    
  • 71

    我将根据你在haskell中的技巧水平订购本指南,从绝对的初学者到专家 . 请注意,此过程需要几个月(几年?),所以它相当长 .

    Absolute Beginner

    首先,haskell能够胜任任何事情,具有足够的技能 . 它非常快(根据我的经验仅在c和c之后),可以用于从模拟到服务器,guis和web应用程序的任何事情 .

    但是,有些问题比haskell更容易为haskell的初学者编写 . 数学问题和列表处理程序是很好的选择,因为它们只需要最基本的haskell知识才能编写 .

    首先,学习haskell基础知识的一些好指南是happy learn haskell tutoriallearn you a haskell的前6章 . 阅读这些内容时,最好还是用你所知道的解决简单问题 .

    另外两个好资源是Haskell Programming from first principlesProgramming 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开发框架 . 不使用数据库,而是使用数据类型存储 . 非常好的文档(其他流行的框架将是snapyesod) .

    此外,您应该最终学习许多概念(如Monad概念) . 这比第一次学习Monads更容易,因为你的大脑将用于处理所涉及的抽象级别 . 学习这些高级概念以及它们如何组合在一起的非常好的概述是Typeclassopedia .

    • Applicative:像Monads这样的界面,但不那么强大 . 每个Monad都是适用的,但反之亦然 . 这很有用,因为有些类型是Applicative但不是Monads . 此外,使用Applicative函数编写的代码通常比使用Monad函数编写等效代码更具组合性 . 请参阅“了解你的哈克尔指南”中的Functors, Applicative Functors and Monoids .

    • FoldableTraversable:抽象列表的许多操作的类型类,以便相同的函数可以应用于其他容器类型 . 另见haskell wiki explaination .

    • Monoid:Monoid是一个具有零(或mempty)值的类型,以及一个将两个Monoid连接在一起的操作,标记为 <> ,例如 x <> mempty = mempty <> x = xx <> (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,我的面向对象编程技能得到了提高,因为我看到了很多抽象思路的新方法 .

相关问题