首页 > Haskell > Haskell学习笔记(1)

Haskell学习笔记(1)

之前看过一些对函数式编程(Function Programming,简称FP)的介绍,一直想通过学习一门FP的语言,来深入了解一下FP。Haskell,就是众多FP语言中的一门,它是一门纯粹的FP语言,是学习FP不错的选择。今天这篇文章主要是对Haskell的一个简单介绍,以及一些正式开始学习之前的准备工作。

  • 1. 什么是Haskell
  • Haskell, 是一门纯粹的函数式的程序设计语言,它是基于Lambda Calculus的。做为一门函数式的语言(Funcitonal Language),与传统的命令式的语言(Imperative Language)相比,它的主要优势在于,代码更为简洁,可靠性更好,语义非常直观,在很大程度上提高了程序员的产出率。
    在开始学习Haskell之前,我们先来看一个例子,相信通过这个例子,读者朋友会对Haskell有一个直观的印象,想学习FP的朋友,会爱上Haskell的:

    1
    2
    
    qsort [] = []
    qsort (p:xs) = qsort [x | x< -xs, x<p] ++ [p] ++ qsort [x | x<-xs, x>=p]

    上面是一个Haskell版本的quick sort,学习过C/C++/Java等命令式语言的朋友,应该知道通过命令式语言实现的quicksort, 大概需要10-20行的代码。相比而言,Haskell版本的quick sort,是多么的简洁、直观。下面简单解释一下上面的代码:第一行是初始化,输入一个空的list, 返回也是一个空的list; 第二行,qsort的输入一个list,把这个list分成两部分,一部分是单独的元素p, 一部分是除去p之外剩下的部分xs,xs也是一个list. 那么,对入p:xs这个list排序的结果就是:对xs中小于p的部分排序的结果,p和对xs中不小于p的部分排序的结果这三部分组成的list。Isn’t it amazing?

  • 2. Lambda Calculus
  • 前面提到了Haskell是基于Lambda Calculus的,所以在学习Haskell之前,我们有必要了解一下Lambda Caculus的一些基本的内容,方便我们后面正式介绍Haskell。其实,Lambda Calculus是所有函数式语言的基础,要学习FP,最好都了解一下Lambda Calculus。下面对Lambda Calculus做一个简单的介绍:
    (1)基本的语法:Lambda Calculus的核心是表达式(Expression),用FP语言写的程序执行的过程,本质上就是对表达式求值的过程

    1
    2
    3
    
    expression := variable | function | application
    funciton := λvariable.expression (.前面部分为定义(definition),后面部分为函数体(body))
    application := expression expression

    (2)变量的bound与free:

    1
    
    λx.xy →x is bound, y is free

    (3)表达式化简(Reduction)的基本法则:

    1
    2
    3
    
    α−reduction: λx.E→λy.E[y/x]
    β−reduction:((λx.E)z)→E[z/x]
    η−reduction(if x is not free in E): λx.(Ex)→E

    (4)变量替换:

    1
    
    [y/x]E →  substitute  all occurrences of x in E to y

    以上是Lambda Calculus的一些基础知识,读者朋友现在不理解没有关系,等后面讲到Haskell中相关的部分就可以理解了。对于抑制不住自已的好奇心的朋友,可以在这里:http://en.wikipedia.org/wiki/Lambda_calculus做进一步的了解。

  • 3. Haskell开发环境搭建
  • 学习任何一门程序设计语言,当然少不了搭建开发环境了。对于Haskell而言,它提供了基于Winddows、Mac、Linux三种平台的开发平台Haskell Platform,大家可以在这里:http://hackage.haskell.org/platform/根据自已的需求下载所需要的版本。我个人比较推荐在Linux下玩Haskell,一个主要的原因是我自已对Linux下开发已经非常熟悉,另一个主要的原因,我觉得对于学习Haskell这么小众语言的朋友,应该是十分热衷于程序设计,或者说是Geek,这样的朋友应该对Linux平台有着独特的感情的。我这里的环境是ubuntu11.04 x86_64, 在ubuntu平台下安装Haskell Platform非常简单:

    1
    
    sudo apt-get install haskell-platform

    通过上面的命令安装成功后,就可以正式开始你的Haskell之旅了。Haskell的compiler叫ghc,是Glasgow Haskell Compiler的缩写。ghc提供了一种交互式的版本叫ghci,方便我们直接在命令行写一些简单的程序。可以直接在linux shell中键入ghc或者ghci,如果这两个命令正常工作,就说明Haskell Platform安装ok了。下面我们来运行一下前面提到的quick sort的例子,来切实的感受一下Haskell:
    (1)打开你所熟悉的文本编辑器,比如vim,写入下面的内容,并保存为qsort.hs:

    1
    2
    
    qsort [] = []
    qsort(p:xs) = qsort[x | x< -xs, x<p] ++ [p] ++ qsort[x|x<-xs, x>=p]

    (2)用ghci编译运行程序:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    wuzesheng@wuzesheng-ubuntu:~/work/haskell$ ghci
    GHCi, version 6.12.3: http://www.haskell.org/ghc/  :? for help
    Loading package ghc-prim ... linking ... done.
    Loading package integer-gmp ... linking ... done.
    Loading package base ... linking ... done.
    Prelude> :l qsort
    [1 of 1] Compiling Main             ( qsort.hs, interpreted )
    Ok, modules loaded: Main.
    *Main> qsort [10, 8, 2, 100, 3, 4]
    [2,3,4,8,10,100]

以上即是本文的所有内容,学习Haskell前的准备工作到此就完成了。接下来,我会陆续写一些介绍Haskell语言的文章,希望感兴趣的朋友一起来学习Haskell,一起学习FP,共同探讨!

分类: Haskell 标签:
  1. doubletony
    2012年7月22日00:15 | #1

    qsort[x | x< -xs, x<p] 这里“< -”中间多了个空格

  2. 2012年7月22日00:18 | #2

    赞细心,不过好像是wordpress的问题,我修改过来,保存下来,还是会有个空格!@doubletony

  3. doubletony
    2012年7月22日01:14 | #3

    @小武哥
    嗯,我其实也觉得应该是wordpress的问题,不然怎么会编译通过。。。

  4. xiaoSA
    2012年12月20日17:26 | #4

    VS2010里面新推出的F#也是一门FP语言。感觉FP真的很神奇~

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
您必须在 登录 后才能发布评论.