了解知识
2014年初开始学习Haskell,把《Learn You a Haskell for Great Good!》和《Real World Haskell》两本书基本看完了一遍。前者据说是目前最好的入门书籍,也有一定的深度;后者则是从实践出发,对各种应用环境又有所涉及。最难能可贵的是,这两本书都提供了免费的在线版本,比纸质版更新,而且还带有批注。
 
除了这两个大部头,还读了《Why Functional Programming Matters》,《Pure Functional Data Structures》等经典文献。此外,《A History of Haskell: Being Lazy With Class》对于了解Haskell的前世今生也很有帮助。
 
只看不写肯定是不行的。最初是打算照着D3(确切的说是mooege)实现个服务端。结果断断续续半途而废,最后只写到解析MPQ文件这部分,还没写完。期间尝试了Haskell的几个库,还是很强大的。像BitGet这样的小库直接拿来改改就能用。
 
还尝试过用Haskell来写GUI。从GUI的实现上Haskell有两个迥异的方向,一种是传统的wrapper,通过FFI把GTK,wx乃至OpenGL包装起来,感觉这样似乎没有什么优势,相比Python等动态语言。虽然成功搭建起来环境,但是还是提不起兴趣。另一个方向是FRP(Functional Reactive Programming),想法挺特别的。核心概念是行为和事件,行为对应于一个随时间变化的值,事件是在某个时间点上发生。如果有时间,值得研究一下。
 
相比Lisp,它至少看起来没那么多括号。相比非函数式语言,它的表达方式更加自然,让你更加关注问题本身,而不是实现细节。出自学院派的Haskell很多设计都更加优雅,更加巧妙,比如类型系统,比如Monad,但却没有因此失去实用性,看看hackage上大量的库就知道。按照80/20的理论,Haskell很适合用来解决那80%问题,而把20%留给C或者其他语言来提高性能。Haskell就像是10年前的Python,什么都行,也什么都不精。当时的Python主要被诟病的是它的性能(其实现在还是),而Haskell的性能并不一定是弱项,更不用说函数式编程对于多核或者并行环境有天生的优势。用Haskell的人很多也用Erlang,后者是在合适的时间合适的领域找到了切入点,有点像是Ruby遇到了Rail。个人还是喜欢Haskell多一点。
 
Monad是Haskell里很关键的一个概念,不理解它,看各种库的代码就很痛苦。但是正如《You Could Have Invented Monads!》一文所说的,Monad只是一种更加优美的表达方式,只是从一些看似无关的应用中归纳出来的一种反噬,并没有超越函数式编程本身。也就是说,不会用Monad并不会阻碍你写Haskell代码。写的多了,也许你自己就总结出Monad了。
 
新的一年,希望看更多库源码,写更多代码,不求大但求快。
标签: Haskell
扩展知识