只是因为在人群中多看了你一眼,再也没能忘掉你的容颜。梦想着偶然能有一天再相见,从此我开始孤单地思念。

qsort [] = []
qsort (x: xs) = qsort smaller ++ [x] ++ qsort larger
    where smaller = [a | a <- xs, a <= x]
          larger = [b | b <- xs, b > x]

没错,第一次看见使用Haskell编写的快速排序算法时,我就有这种感觉。但跟大多数人一样,在工作中是不大有机会去使用Haskell的,于是我只能偷偷摸摸地在其他语言中尝试一些函数式编程中的技巧,用JavaScript写一些高阶函数;在元素不多时,写一个递归算法对元素排序……为什么要偷偷摸摸的?因为这些程序在没学过函数式编程的人看来,难于理解,是不好的代码。

命令式编程(Imperative Programming) vs 声明式编程(Declarative Programming)

什么是命令式编程?就是现在大家普遍采用的编程方式,就是要告诉计算机每一步应该怎么做的编程方式。以求1到10的和的程序为例,大家一般会这么写:

int count = 0;
int total = 0;
while(count < 10){
    count = count + 1;
    total = total + count
}

翻译成普通话就是:使用两个变量,一个变量用来计数,一个变量用来记录和,然后从0开始计数,加1、加2、加3……加10,最后变量total就是1到10的和。它的计算方式是使用变量存储值,然后通过流程控制不断修改变量里的值。

什么是声明式编程?就是告诉计算机我想做什么,但不告诉计算机每一步应该怎么做的方式。就像个将军对手下人发号施令“一定要在10点前,拿下109高地!”怎么拿下?那就不关我的事了。还是上面的例子,看看怎么用声明式的方式来编写:

sum [1..10]

很简单,我给你10个数,你给我把它们加出来。同样的功能,使用命令式编程得写6行,而声明式编程一行搞定,据统计,使用Haskell编写的程序代码量通常是其他语言的二到十分之一。细心的读者要问了,你这sum哪儿来的?我也可以把命令式的代码定义在一个函数里,然后也是一行代码搞定。首先恭喜你能用函数的思想考虑问题了,其次,这里只是一个例子,重点是展示计算过程是一个不断应用函数的过程。首先对参数1, 10使用函数..,返回列表[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],然后再对该列表使用函数sum返回最终的结果。

两相对比,命令式编程面向的是计算机,它必须要告诉计算机每一步该干些什么;而声明式编程面对的是人,只需要知道人想做什么。

未完待续

函数式编程的优点

为什么要使用Haskell

Hello Haskell!