Haskell函数程序设计基础
Haskell函数程序设计基础
1000+ 人选课
更新日期:2025/06/16
开课时间2023/02/14 - 2023/05/09
课程周期12 周
开课状态已结课
每周学时-
课程简介

       本课程用函数式程序设计语言Haskell讲解现代函数式程序设计的基本思想方法。   

       高级程序设计语言大致可分为命令式和声明式。命令式语言如C、Java和Python等,这种语言的程序用一个语句序列描述如何一步步完成一个计算,特点是有副作用。例如,计算1至n的和,命令式语言通常形如:  

s = 0; for (int i=1; i<=n; i++)     s = s + i; print(s);这种程序通过不断修改变量s的值最后得到计算结果。重点描述如何计算

        Haskell函数式语言属于声明式语言,这种语言的程序通过计算逻辑表达计算,不需要描述计算次序,特点是无副作用。对于同样的问题,在Haskell语言中可以定义数学函数sum:

sum 0 = 0 sum n = n + sum (n-1)

在这里,计算1至n的和的Haskell函数程序是表达式sum n,sum是一个纯数学函数,n是数学意义上的变量,没有副作用。函数式程序重点描述计算什么

        函数式程序设计语言是建立在计算模型λ演算上的通用高级程序设计语言。由于它具有更高的抽象层次,更接近于人类的习惯数学思维,因此,更便于初学者理解掌握。

        函数式程序具有下列特点:

  • 简洁优美,容易理解。

        了解命令式程序设计的程序员明白,用命令式语言实现快速排序并不简单。然而,下面几行简短的Haskell代码用列表概括表达了快速排序的计算逻辑:


qsort []   = [] qsort (x:xs) = qsort [y|y <- xs, y < x] ++ [x] ++ qsort [y|y <- xs, y >= x]

这里[ ]表示空列表(或序列),(x:xs)表示非空列表,x是第一个元素,xs是尾列表,[y|y <- xs, y < x]表示xs 中小于x元素构成的列表,[y|y <- xs, y >= x]表示xs中大于等于x元素构成的列表,++表示将两个列表串接成一个列表的运算。

  • 无副作用,更少的程序错误。

        命令式程序中的函数多为有副作用的“过程”。一个纯函数的计算结果只与函数的输入有关,与计算次序无关,由此避免了命令式程序中由副作用引起的一类错误。

  • 高阶函数支持更高抽象性,支持模块化。

        在Haskell语言中,函数是“一等公民”,函数可以是其他函数的输入和输出,由此为代码重用性和模块化提供了方便。

  • 惰性计算为无穷数据结构提供支持。

        Haskell是一种惰性语言,这表明它只有在需要计算的时候才进行计算,或者只做必要的计算。这种惰性计算允许表达无穷数据结构,由此也为模块化提供了一种途径。

  • 易于推理,便于保证程序正确性。

        Haskell函数没有副作用,因此,可以像对待数学表达式那样对程序进行推理,便于确保程序的正确性。

        本课程是函数式程序设计的入门课程,也是一般程序设计的入门课程。本课程通过函数程序设计语言Haskell介绍函数程序的基本思想和方法,以及现代程序设计的基本思想,如函数抽象、多态、重载和高阶函数等。

        课程共11讲。前3讲构成程序设计的最基本内容,学完前三讲后学生便可以编写简单的函数程序。第4-6讲构成程序设计的进阶内容,学完第6讲以后学生可以编写较复杂的程序,并学会使用测试工具测试程序的性质。第7讲学习多态和重载的概念,如何编写多态和重载函数程序。第8讲学习函数式程序的重要特性高阶函数。第9讲学习如何自定义代数类型准确刻画数据。第10讲学习用Haskell如何编写有副作用的程序,包括交互式小游戏和模拟计算。第11讲学习Haskell的惰性计算策略,如何基于惰性计算使用无穷数据结构处理数据。

        对于初学程序设计的学生,本课程将为学生提供一个更简单的计算模型,专注于数学或者抽象层面的程序设计思想和方法,完成课程后将能使用Haskell函数语言解决一些实际问题。

        对于已经掌握一门程序设计语言的学生,修读该课程后将可以用函数式程序设计的思想理念设计更清晰、易读和易维护的程序,成为更好的程序员。

       事实上,程序设计语言存在几百种(据统计有超过700种),一名优秀的程序员不是掌握了很多种语言,而是应该掌握几百种语言背后的少数几种编程范式(programming paradigm),或者程序设计概念模型,包括命令式程序设计、函数式程序设计、面向对象的程序设计、逻辑程序设计和数据流程序设计等。

课程大纲
程序设计与函数式程序设计简介(第1讲)
1.1 命令式程序设计
1.2 函数式程序设计
1.3 Haskell解释器
函数程序设计基础(第2-5讲)
2.1 程序与函数
2.2 数据和类型:基本数据类型、多元组和列表
2.3 Haskell函数定义:函数定义语法规则和举例
2.4 递归函数:阶乘、斐波那契数列和汉诺塔举例
2.6 模块定义和使用,使用hoogle查找库函数
2.5 基于性质的随机测试工具QuickCheck
列表程序设计(第6讲)
3.1 列表的构造:列表构造函数和列表概括
3.2 图书借阅管理:列表概括举例
3.3 一个字符图形库的设计:图形类型和图形运算的定义
多态与重载(第7讲)
4.1 多态类型和多态函数的概念
4.2 重载和类族:重载概念,Haskell的重载机制
4.3 常用类族:Eq、Show、Ord等
4.4 重载函数的定义
高阶函数(第8讲)
5.1 高阶函数的概念
5.2 λ表达式
5.3 常用高阶函数:map, filter、foldr和函数复合
5.4 卡瑞化和部分应用
5.4 高阶函数举例:词频统计
代数类型(第9讲)
6.1 自定义类型:使用构造函数定义代数类型
6.2 数据类型的归纳定义:自然数集合和表达式集合定义
6.3 带参数的自定义类型:Maybe和[a]的定义
IO程序(第10讲)
7.1 IO类型:动作程序的类型,基本动作程序,动作连接的do语法
7.2 模拟计算:随机事件模拟,蒙特卡洛方法
7.3 文件读写
惰性计算(第11讲)
8.1 惰性计算概念:惰性与严格,Haskell的计算规则
8.2 无穷数据结构举例:艾拉托斯特尼筛法,牛顿迭代法
函子与单子(选修)
9.1 函子:Functor定义和实例定义
9.2 单子:Monad定义和实例定义
9.3 单子语法分析器:表达式的单子语法分析器