最近我们组打算重构tightvnc源码,而我准备先当马前卒,把多线程换成单线程,对抓屏、分析、发送改成单线程,去掉不怎么需要的模块,预计工作会比较繁琐。
当然,以上是题外话。来公司一年后差不多零散的新学了五门语言,而比较特别的便是haskell了。之前快毕业的时候在学校看了一点函数式编程的资料,也看了haskel,但很快由于松散搁置了,因为像大多数程序猿一样觉得用处不大。最近又开始学是因为听了组内一个牛人波仔的讲座,而他的例子就是haskell,加上姚老师鼓励我们学习函数式编程,便又打算重新理一遍。本文打算从语言的角度来学习,由于目前只看了一半,先做个上集吧,有些概念不一定对,欢迎大家指正。
1、haskell中的变量跟其他命令式语言的变量不一样,比如你可以在其他语言执行一下赋值语句:
a = 5 a = 6 (python, js)
int a = 5; a = 6(c++/c,OC)
var a int = 5 a =6 (go)
但haskell不行,如果你执行:
a = 5 a = 6
将会得到错误:
Multiple declarations of `a'
haskell中的变量定义之后就不能被赋值,懒计算是不是呢?
2、haskell能解释执行也能编译执行,不过我一般用编译器GHCI,在preclude中输入!ghc --make filename.hs便可以得到可执行文件了,前提是filename.hs文件书写了main函数.
3、注释与其他语言异类:用的是--和{-语句-}两种;
4、多态与pattern matching:可以参考一下c++的多态和模板,可以写出非常优雅的代码,如最著名的快排:
qsort :: (Ord a) => [a] -> [a] qsort [] = [] --edge condiction qsort (x:xs) = qsort qsort_left ++ [x] ++ qsort qsort_right where qsort_left = [left | left <- xs, left < x] qsort_right = [right | right <- xs, right >= x]
当然也可以用let和in来写,是不是很直观优雅,让人心醉啊。
解释:其中Ord是typeclass,按haskell的文档所说,有点类型java里的接口。类型a相当于是Ord的一个实例,重载了Ord里面的所有算子,Ord a相当于是对类型a的一种约 束。上述那段话可以解释为:对于每一个类型a,类型a必须是class的一个实例(即类型a可以使用算子">="等等),函数qsort的参数声明为输入一个列表,返回一个列表。如果去掉(Ord a),会得到如下错误:
No instance for (Ord a) arising from a use of `>=' In the expression: right >= x In a stmt of a list comprehension: right >= x In the expression: [right | right <- xs, right >= x]
'>='便是typeclasses的operator,有点抽象,可以慢慢体会。
5、跟python一样,用缩进来表示区域范围,所以就不要蛋疼的混用tab和space了。不过养成好的编码习惯就好,小小提个问题,还记得js中的蛋疼的{}吗?有陷阱的。
6、优先级:haskell中函数是一等公民,所以优先级最高,高于所有运算符。
7、定义新类型可以使用Data关键字,记住要大写(Go里面也有一个关于大小写区域可见的问题,有兴趣可以去了解下),为已有类型定义别名使用type关键字。
上面主要讲的是haskell的类型和一些基本语法,下次我看看能讲写关于高阶函数的东西否。祝周末愉快!
对我有兴趣的同学可以关注我的微博:@Graphic鹰仔.