Skip to content
thzt edited this page Jan 23, 2015 · 2 revisions

Book Information

Review by [thzt]

  • Rank: ★★★
  • Hard: ★★★★
  • Tag: type,type class,monad,currying
  • Reviews:

其实这本书是半年前读的,只是没想到要总结一下,于是就不了了之。

这不是一个好习惯,所以,还是回想一下当时的感受吧,

Better late than never.


这是一本英文书,目前有一个小组在翻译它,不过还没有翻完。

不过,我是觉得,对于不太流行的书来说,还是看原版的好一些,

因为有些术语实在没有标准的中文对照,胡乱翻译的中文书,反而会误人子弟。


这本书很厚,大概有700多页,

但是,既然都想要仔细学习一下haskell了,这点难度休想让我放弃,

让暴风雨来得更猛烈些吧。


haskell is a deep language.

看完这本书,我深有体会。

就好像学计算一个复杂式子的不定积分一样,

计算完后再看看,似乎根本看不出问题和结论之间的任何联系。


这种事情很少发生在毕业以后的日子里了,

记得上次发生还是在推导Y combinator的时候。


说说这本书吧,

本书实例很多,但是也因此是不足之处,

多实例,意味着后文要引用前文的定义,于是如果记忆力不好的话,经常要翻到前面重新看一下。


我们还是从头到尾过一遍吧,

先介绍了haskell的编程环境,然后就开始讲类型了,

我觉得关于类型的讲解,这本书是目前为止看到的最透彻的,

为什么需要类型,静态类型,动态类型,强类型,弱类型,都很清晰,

再就开始介绍list和tuple了,无需多言,

然后,lazy evaluation乱入,事实上,lazy evaluation其实是不像很多人想的那样的,明白了thunk才行。

Currying也是后面用的很多,parameterization,currying,type,functional,几乎可以算是haskell的特色了。


后面呢,

先介绍了如何定义自己的数据类型,类型别名,newtype这个编译期外壳其实可以玩很多花招的。

什么algebraic data type,都是自然而然的事情了。

然后,开始了模式匹配,构造和解构,通配符。

再就是重点来了,带参数的数据类型,其他语言可以称为泛型吧,

最后是递归类型,再就是一些语法介绍了。


再继续,

花了很多篇幅,来说明函数式编程的基本套路,

可不要小瞧呀,这里就是上文提到的,deep的地方之一,

用foldr来表示foldl,有些时候简洁真不意味简单。

最后,用了一章来介绍了一个实例,JSON数据的使用。


然后,

type class来了,很多人都栽到了这里,

因为有一种内置的type class极难理解,那就是Monad,

其实,理解以后很简单嘛,“monad就是一个自函子范畴上的幺半群而已,这有什么难以理解的。”

说笑了,其实monad之所以难以理解,是因为要对以下定义同时熟悉才行,而这些概念又是haskell里面定义的,

函数的类型声明,parameterized type,newtype,lambda表达式

如果这些概念不只是理解,而是熟悉了,那么monad就简单了。


这一点上,我觉得数学确实也是这样,只是理解而不熟练,迟早会走到山穷水尽的地方。

熟练的使用,也是一种有用的知识储备。


在就该IO操作了,使用monad,将纯函数与不纯的函数分开,是个绝妙的设计思想,

不过,在这里,不要人云亦云,要自己理解,看完以后才知道很多人的说法都是随便说说罢了。


然后的然后,

介绍了haskell中处理文件,正则表达式的一些方法,其实就是内置的函数库介绍了,

又举了几个例子,用了一百多页,真是宏篇巨例呀,对得起real world的名字。


后来又插入了test case的写法,没怎么看,用的时候再说吧,

然后又是几章例子,太real world了。


终于,把读者搞晕以后,开始详细的介绍monad了,

各种Moand的实例忽然活跃起来了,然后狂引用前面的例子,前面幸亏我没仔细看。


然后呢,提升了一个段位,恭喜你从函数式编程变身成了thinking in monad了。

这一点,我暂时以为,似乎haskell的传教士们把monad的地位放的太高了,

就好比上帝给了他们一件武器,他们拿着到处炫耀一样。

炫耀的多了以后,人们就知道了,也就这点可以炫耀的了。


诚然,纯函数式和惰性求值,就是haskell的亮点,而monad是其中的关键。


再回到书中,作者又开始卖萌了,

为了展示monad的厉害之处,写一个语法分析器吧,这个在其他语言似乎要了命了,

haskell有自己的libraray可用,so easy。


haskell这么牛,但其他语言毕竟用的人多嘛,于是,后面又介绍了haskell与C混合编程,

谁叫C语言的函数库已经统治了世界了呢。


爽了一把之后,开始了monad transformer了,

觉得就是把monad又用另一个monad包装了一次,让一个monad可以具有多种功能。


最后,用了一章讲了一下如果处理错误,so functional,很惊讶,更惊讶的是,居然也是monad。

然后就是系统编程,数据库,web,GUI,等等,常见项目中怎么玩haskell。


还没完,然后将了concurrent与多核环境下的编程,这章没看。

再就是一些高级主题,优化什么的,然后就是软件事务内存,终于结束了。


整本书下来,很明显有个转折点,monad之前,世界很美好。

monad之后,世界也很美好。

只是中间,着实郁闷了几天。


书评写的很烂,感谢有人能看到这里。

半推荐这本书吧,不过要想学haskell的话,再难的书,“那都不是事”。