Skip to content

Learn You a Haskell for Great Good

thzt edited this page Jan 31, 2015 · 4 revisions

Book Information

Review by [yitapi] -- a.k.a. kkfred

  • Ranking: ★★★★
  • Hardness: ★★★
  • Tag: haskell, type, type class, monad, comics
  • Reviews:

说Haskell很难的人大有人在,我在这里也不会在多重复。

我想说的是,Haskell难很大程度在于它的无限可能性,和几乎无穷无尽的学习曲线。

它的学习曲线虽然长,但绝对不是陡峭万分无法攀登的,Learn you a Haskell这本书(以下简称LYAH),就是想说明这点: Haskell不仅是可以被初学者学习的,而且学习的过程还可以很有趣。
我最开始看LYAH的时候作者Miran Lipovaca还没有完成它,不过每写一章都会放在网站上。所以这里也仅仅是原版的读后感,中译本去年出了,我也不太清楚翻译质量。

当时似乎流行起来一股编程书漫画风,包括LYAH,Land of Lisp, 后来出现的Learn you some Erlang等等,都用了大量的漫画来让本来被认为是枯燥的编程书籍变的有趣。

这里不对书中的漫画做什么评价--我个人认为他们是相当有趣的。对于一个喜爱数学游戏的人而言,我相信Haskell本身就已经足够有趣了。作者在书中也是想要表明这样一种观点和姿态。和Real World Haskell不一样,这本书完全不是站在一个实用主义者的立场上 -- 如果你想要快速Haskell上手写个GUI,做个网站 -- 请到别处去。不过如果你想理解基本的Haskell概念: 类型,函数,如何用高阶函数组织你的运算,如何实现函数的多态(type class),甚至如何用类型来构造强大的运算模型(Monad, Zipper),这本书绝对是一个适合的起点。这个角度来说,我个人觉得它完全适合作为第一本Haskell读物,甚至第一本函数式编程读物或者第一本编程读物。

书的前十章,基本上都是比较容易的内容,作者以大量的例子,介绍了Haskell的基本语法。边读边在GHCi中试验各种例子,会给你一种GHCi是一个无比强大的计算器的感觉。书中虽然没有习题,不过这部分的内容完全足以支持你用Haskell去Project Euler上挑战各种各样的数学难题,它们也是相当好的脑力练习题。

最后四章,作者开始介绍一些作为运算模型的type class,也是一些有着吓人名字的东西: Functor, Applicative, 特别是Monad。Monad本身,已经在无数个博客、论文、论坛讨论被说烂,某种意义上被莫名其妙的神化了。LYAH这本书引入Monad的角度也是我觉得最好的一个角度,即让读者自己在一些重复的例子中发现这样一种运算的模式,作者再将这种模式抽象为Monad。个人拙见是,从这个角度理解的Monad,本质上和高阶函数是一样的意思。作者紧接着立刻介绍了最常用的三个Monad: Reader, Writer, State,并在这个过程中引入了Monoid等。每个Monad都是以例子来讲解,让读者真正去用,而不是停留在“试图理解”Monad止步不前。-- 作者传达了这样一种信息,与其会说Monad是这个是那个,不如会用Monad来做点事情。我认为这也是一个高明的姿态:我们已经见过太多太多试图说Monad是什么的文字了。

最后一章讲Zipper,也是个挺有意思的选择。我没有实用它的经历,留待其他人来补充好了。

总而言之,如果你喜欢数学,喜欢编程,听别人说Haskell怎么怎么样有点心痒痒,看这本书就对了。这本书看完,还想要更多?相信你能找到自己的路了--我也正在这条路上。

Review by [thzt]

haskell的书不太多,像本书这样轻口味的更少。


正如本书开篇提到的。

Work on Haskell began in 1987 when a committee of researchers got together to design a kick-ass language.

[最初的工作始于 1987 年,一群学者聚在一起想设计一个吊到爆的编程语言]。

haskell设计的目的就是把你搞晕,总有重口味爱好者的。


这不是嘛,爱好数学的人们,看到这个语言,喜欢的不得了。

随着一阵阵眩晕和颤抖,得到了他们需要的快感。


本书则不同,以平淡的文字,描述着一件件惊天动地的事情。

这就是本书的魅力所在了吧,换一换风格,会有新的认识。


首先,目录是用缩进形式写的,haskell style啊。

后来发现,haskell erlang python,不知道怎么的互相影响。

列表解析呀,模式匹配啊,后来连go也同流合污了。


理解以后才明白,原来这就是函数式风格呀。


身为血统最纯正的函数式语言,haskell是一个贵族。

硬生生的用monad把世界分成两半了。

有副作用的,没有副作用的。


如果你从其他书中觉得monad难以理解,本书可以为你解惑。

正如其他概念functor, applicative一样,monad也是提炼出来的。

你发现很多函数互相调用,有套路可循。


可以将套路抽象出来,做一个运算控制器。

那么它很可能就是functor, applicative或者monad了。

只不过加上类型以后,把你搞晕了而已。


但是,也不能高兴的太早,对运算模式的抽象和对数据的抽象。

haskell走的很远。

其他语言因为缺乏原生机制来支持,所以往往不够精炼。


所以,学习haskell能让你拥有先进的思维方式。

在任何其他语言中,都可以写出不一般的代码。

很简单,你先实现一个运算控制器,然后当做类库使用就行了。


另外,本书monad和monoid看起来很像,其实是不同的概念。

我看了好几遍才发现,这居然是两个不同的单词。

只能怪自己对字母不敏感了。


总之,本书乐趣十足,是居家旅行必备图书。

Clone this wiki locally