Skip to main content

Problem Sheet for LI Functional Programming - Week 1

提示
  • 本 ProblemSheet 备份于此处。(不保证与源文件同步)

Jupyter 笔记本

我们将使用 Jupyter,一个基于网络的互动开发环境,以便有一个标准的平台来完成本课程中的所有任务。本课程的所有任务有一个标准的平台。计算机科学学院拥有自己的服务的实例,你可以连接到这里。我们的第一个问题集将涉及到熟悉这个开发环境。

终端

Jupyter 包括一个 Unix 终端系统,可以用来创建文件和目录,编译源模块和运行程序。如果你对 Unix 终端不熟悉,这第一个练习将向你展示一些最基本的命令。

  1. 要打开终端,从 Jupyter 启动器中选择"终端"。然后你应该看到一个带有闪烁光标的命令提示。
  2. 命令 pwd 代表 "打印工作目录"。输入它并按下回车键将显示你在系统中的当前位置。
  3. 你可以用 mkdir 命令创建一个新目录。例如,试试 mkdir scratch 来创建一个新的 scratch 目录。
  4. 你可以用 cd 命令改变目录。试着用 cd scratch 来切换到你刚刚创建的目录。
  5. 有许多方法可以创建新文件。一个简单的方法是使用 touch 命令。试试 touch foo.txt 来创建一个空的文本文件。
  6. 你可以用 ls 命令列出当前目录下的文件。现在试试,看看你创建的文件。对于文件的更多信息,你可以尝试 ls -l,它将显示,例如,创建者,大小和创建日期和时间。
  7. 要在列表中包括隐藏的文件(即以". "开头的文件),你可以使用命令 ls -la 。注意,有两个特殊的隐藏文件(实际上是隐藏的目录),即 . 表示当前目录,. 表示父目录。尝试改变这些目录,看看会发生什么。

我们将在下面的一些练习中遇到更多的命令。

克隆课程资源库

Git 是目前最流行的版本控制系统之一。它被用来跟踪文件,因为它们在开发过程中被修改和变更。你的模块团队使用这个系统来更新和修改课程材料。

  1. Go to the FP Learning Repository on GitLab.
  2. Click the blue "Clone" button and copy the HTTPS URL to your clipboard.
  3. In Jupyter, open a terminal.
  4. Type git clone and then paste the url from your clipboard with Ctrl-V. Press Enter. The whole command should look like this:
git clone https://git.cs.bham.ac.uk/mhe/fp-learning-2021-2022.git
  1. You should be prompted for your CS username and password.
  2. When the cloning process has finished, you should see a new folder named "fp-learning-2021-2022" in your home directory.
  3. Explore the resulting folder with the Unix commands you have learned above.

运行和编译生命的游戏 Life of Game

  1. 让我们首先创建一个文件的副本来工作。要复制一个文件,我们使用 cp 命令。(注意在 cp 命令中使用了父目录 . )
cd /jupyter/work
mkdir life
cd life
cp ../fp-learning-2021-2022/LectureNotes/Sections/Life.hs .
  1. 我们可以用以下命令直接运行该程序
runhaskell Life.hs
  1. ctrl-c 停止程序。
  2. 另外,我们也可以将源代码编译成可执行文件,以便能够直接从系统中运行它。这可以通过 ghc 的 "make" 选项来完成,它将负责编译、连接以及包括任何依赖性。
ghc --make Life.hs
  1. 我们可以通过输入以下信息来运行生成的可执行文件
./Life

修改生命的游戏

  1. 要查看源代码,用文本编辑器打开文件。
  2. 默认情况下,该程序使用文件顶部定义的 "滑翔机 "网格。我们可以在以下一行看到这一点
main :: IO ()
main = life glider
  1. 尝试切换到另一个定义的网格。
  2. 在屏幕上用什么字符来表示活细胞?试着把它改成一个你选择的字符。
  3. 尝试添加一个你自己的网格。一些有趣的例子可以在维基百科的生命游戏页面上找到。

制作和解释 Haskell 源代码模块

  1. 在你选择的目录中建立一个名为 foo.hs 的新文件。你可以用终端或文件浏览器来做。
  2. 添加以下内容:
double :: Int -> Int
double x = x + x
  1. 打开一个新的终端窗口。
  2. 运行 ghci 来启动 Haskell 解释器。
  3. 加载新的文件,如下所示。
Prelude> :l foo.hs
[1 of 1] Compiling Main ( foo.hs, interpreted )
Ok, one module loaded.
  1. 用你喜欢的数字运行函数 double
*Main> double 6

检查 Ghci 中的一些类型

使用 ghci 找出下列表达式的类型

  1. not (not (not False))
  2. (True,False) (see Section 3.4 of Programming in Haskell)
  3. ['a', 'b', 'x'] (see Section 3.3 of Programming in Haskell)
  4. [(3,4),(4,6)]
  5. (++) (What is strange about this type? See "polymorphic functions" discussed later.)

Ill-typed Expressions 错误类型的表达式

  1. 用 Haskell 写出 5 个 ill-typed expressions
  2. ghci 中检查它们的类型 - ghci 怎么说?
  3. 当你试图评估该表达式时会发生什么?