简单谈谈haskell

  最近我们组打算重构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鹰仔.

posted @ 2013-05-25 17:16  数据牛仔  阅读(3024)  评论(0编辑  收藏  举报