Haskell趣学指南.pdf
《Haskell趣学指南 》这份教学主要针对已经有使用命令式程序语言 (imperative programming languages) 写程序经验 (C, C++, Java, Python …) 、却未曾接触过函数式程序语言 (functional programming languages) (Haskell, ML, OCaml …)的读者。就算没有写程序经验也没关系,会想学 Haskell 的人我相信都是很聪明的第ⅱ页目录Haskell趣学指南第五章递回52S5.1你好,递回52S5.2实现 Maximum53S5.3来看几个递回函数54S54“快速”排序57S55用递回来思考59第六章高阶函数6186.1 Curried functionsS6.2是时候了,来点高阶函数!S6.3map与 filter6786.4 lambda72S6.5关键字fold74§6.6有$的函数调用80$6.7 Function composition第七章模组( Modules)85S7.1装载模组857.2 Data. List8787.3 Data. Char87.4 Data. Map103$7.5 Data Set108S7.6建立自已的模组111Haskel趣学指南目录第ⅲ页第八章构造我们自己的 Types和 Typeclasses117S8.1 Algebraic Data Types入门117§8.2 Record syntax121§83 Type parameters12488.4 Derived instances130§8.5 Type synonyms135S86 Recursive data structures(递回地定义数据结构)...140S8:7 Typeclasses的第二堂课14588. 8 yes-no typeclass15088.9 Functor typeclass15388.10 Kind157第九章输入与输出16389.1 Hello, world164S9.,2文件与字符流178S9.3命令行引数195S94乱数89.5 Bytestrings211S9.6 Exceptions(异常)218第十章函数式地思考来解决问题227S10.1运算逆波兰表示法( Reverse polish notation form)22710.2路径规划232第ⅳv页目录Haskell趣学指南第十一章 Functors, Applicative Functors与 Monoids243§11.1温习 Functors$11.2 Applicative functors.257§11.3关键字“ newtype”.27711.3.1 USing newtype to make type class instances28011.3.2 On newtype laziness28211.3.3 type vs newtype vs data.284$11.4 Monoids.28511.4.1 Lists are monoids28911.4.2 Product and sum11.4.3 Any and ALL.29211.4.4 The Ordering monoid29311.4.5 Maybe the monoid29711.4.6 Using monoids to fold data structures299第十二章来看看几种 Monad304S121动手做做看: Maybe monad306$12.2 Monad type class30§123走钢索...314S124do表示法321$12.5 List Monad32712.5.1 A knights quest333S12.6 Monad laws(单子律).33612.6. 1 Left identity33612.6.2 Right identity33712.6.3 Associativity.338Haskel趣学指南目录第ⅴ页第十三章再来看看更多 Monad341S131你所不知道的 Writer monad34213.1.1 Monoids的好处34413.1.2 The Writer type34613.1.3 USing do notation with Writer34813.1.4 Adding logging to programs35013.1.5 Inefficient list construction35213.1.6 Difference lists35313. 1.7 Comparing Performance355$13.2 Reader Monad356$13.3 State Monad35913.3.1 Stack and Stones36113.3.2 The State Monad36213.3.3随机性与 state monad366813.4 Error Monad.367S135一些实用的 Moandic functions36913.5.1 lift37013.5.2 The join function37313.5.3 filter37713.5.4 fold37913.5.5 Making a safe rPn calculator38013.5.6 Composing monadic functions384S13.6定义自己的 Monad386第ⅵ页目录Haskell趣学指南第十四章 Zippers数据结构393S141来走二元树吧!S142凡走过必留下痕迹39714.2.1 Going back up39814.2.2 Manipulating trees under focus14.2.3 I'm going straight to top, oh yeah, up where the air isfresh and clean§143来看串行403144阳春的文件系统40514.4.1 A zipper for our file system40614.4.2 Manipulating our file systemS145小心每一步.410附录AFAQ414SA.1我能把这份教学放在我的网站吗?我可以更改里面的内容吗?414§A.2推荐其它几个 Haskell读物?414SA.3我怎么联络到你?414SA.4我想要一些习题!414§A.5关于作者414SA.6关于简体译者415SA.7关于繁体译者415附录 B Resource416SB. 1 Specification416SB2 Tools4168B.3 Lectures articles416Haskell j趣学指南目录第ⅶi页8B.4 Forum4178B.5 Online Judge4178B.6 Books4188B.7 PL Researchers4188B.8 Interesting Projects4188B.9 Taiwan Functional Programming User Group418第一章简介s11关于这份教学欢迎来到 Haskell趣学指南!会想看这篇文章表示你对学习 Haskell有很大的兴趣。你来对地方了,来让我简单介绍一下这个教学。撰写这份教学,一方面是让我自己对 Haskell更熟练,另一方面是希望能够分享我的学习经验,帮助初学者更快进入状况。网路上已经有无数Haskell的教学文件,在我学习的过程中,我并不限于只参考一份来源。我常常阅读不同的教学文章,他们每个都从不同的角度出发。参考这些资源让我能将知识化整为零。这份教学是希望提供更多的机会能让你找到你想要得到的解答。这份教学主要针对已经有使用命令式程序语言( imperative program-ming languages)写程序经验(C,C++,Java, Python…)、却未曾接触过函数式程序语言( functional programming languages)( Haskel,ML, OCaml的读者。就算没有写程序经验也没关系,会想学 Haskell的人我相信都是很聪明的。若在学习中遇到什么地方不懂的, Freenode irc上的# Haskell频道是提的绝佳去处。那里的人都很友善,有耐心且能体谅初学者。(译注第2页第一章简介Haskell趣学指南Stackoverflow上的# haskell tag也有很多 Haskell神人们耐心地回答问题,提供给不习惯用IRC的人的另一个选择。)我经历了不少挫折才学会 Haskell,在初学的时候它看起来是如此奇怪的语言。但有一天我突然开窍了,之后的学习便如鱼得水。我想要表达的是:尽管 Haskell乍看下如此地诡异,但假如你对程序设计十分有兴趣,他非常值得你学习。学习 Haskell i让你想起你第一次写程序的感觉。非常有趣,而且强迫你 Think different。§12什么是 Haskell?Haskell是一门纯粹函数式程序语言( purely functional programminglanguage)。在命令式语言中执行操作需要给电脑安排一组命令,随着命令的执行,状态就会随之发生改变。例如你指派变量a的值为5,而随后做了其它一些事情之后a就可能变成的其它值。有控制流程( control How),你就可以重复执行操作。然而在纯粹函数式程序语言中,你不是像命令式语言那样命令电脑“要做什么”,而是通过用函数来描述出问题“是什么”,如“阶乘是指从1到某个数的乘积”,“一个串行中数字的和”是指把第一个数字跟剩余数字的和相加。你用声明函数是什么的形式来写程序。另外,变量( variable)一旦被指定,就不可以更改了,你已经说了a就是5,就不能再另说a是别的什么数。(译注:其实用 variable来表达造成字义的 overloading,会让人联想到 imperative languages中 variable是代表状态,但在 functionalanguages中 variable是相近于数学中使用的 variable。x=5代表x就是5,不是说x在5这个状态。)所以说,在纯粹函数式程序语言中的函数能做的唯一事情就是利用引数计算结果,不会产生所谓的“副作用( (side effect)”
用户评论
yusheng40882 2019-05-15 08:36:58
非常好 喜欢