Problem Sheet for LI Functional Programming - Week 1
提示
- 本 ProblemSheet 备份于此处。(不保证与源文件同步)
Jupyter 笔记本
我们将使用 Jupyter,一个基于网络的互动开发环境,以便有一个标准的平台来完成本课程中的所有任务。本课程的所有任务有一个标准的平台。计算机科学学院拥有自己的服务的实例,你可以连接到这里。我们的第一个问题集将涉及到熟悉这个开发环境。
终端
Jupyter 包括一个 Unix 终端系统,可以用来创建文件和目录,编译源模块和运行程序。如果你对 Unix 终端不熟悉,这第一个练习将向你展示一些最基本的命令。
- 要打开终端,从 Jupyter 启动器中选择"终端"。然后你应该看到一个带有闪烁光标的命令提示。
- 命令
pwd
代表 "打印工作目录"。输入它并按下回车键将显示你在系统中的当前位置。 - 你可以用
mkdir
命令创建一个新目录。例如,试试mkdir scratch
来创建一个新的 scratch 目录。 - 你可以用
cd
命令改变目录。试着用cd scratch
来切换到你刚刚创建的目录。 - 有许多方法可以创建新文件。一个简单的方法是使用
touch
命令。试试touch foo.txt
来创建一个空的文本文件。 - 你可以用
ls
命令列出当前目录下的文件。现在试试,看看你创建的文件。对于文件的更多信息,你可以尝试ls -l
,它将显示,例如,创建者,大小和创建日期和时间。 - 要在列表中包括隐藏的文件(即以". "开头的文件),你可以使用命令
ls -la
。注意,有两个特殊的隐藏文件(实际上是隐藏的目录),即.
表示当前目录,.
表示父目录。尝试改变这些目录,看看会发生什么。
我们将在下面的一些练习中遇到更多的命令。
克隆课程资源库
Git 是目前最流行的版本控制系统之一。它被用来跟踪文件,因为它们在开发过程中被修改和变更。你的模块团队使用这个系统来更新和修改课程材料。
- Go to the FP Learning Repository on GitLab.
- Click the blue "Clone" button and copy the HTTPS URL to your clipboard.
- In Jupyter, open a terminal.
- 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
- You should be prompted for your CS username and password.
- When the cloning process has finished, you should see a new folder named "fp-learning-2021-2022" in your home directory.
- Explore the resulting folder with the Unix commands you have learned above.
运行和编译生命的游戏 Life of Game
- 让我们首先创建一个文件的副本来工作。要复制一个文件,我们使用
cp
命令。(注意在cp
命令中使用了父目录.
)
cd /jupyter/work
mkdir life
cd life
cp ../fp-learning-2021-2022/LectureNotes/Sections/Life.hs .
- 我们可以用以下命令直接运行该程序
runhaskell Life.hs
- 用
ctrl-c
停止程序。 - 另外,我们也可以将源代码编译成可执行文件,以便能够直接从系统中运行它。这可以通过 ghc 的 "make" 选项来完成,它将负责编译、连接以及包括任何依赖性。
ghc --make Life.hs
- 我们可以通过输入以下信息来运行生成的可执行文件
./Life
修改生命的游戏
- 要查看源代码,用文本编辑器打开文件。
- 默认情况下,该程序使用文件顶部定义的 "滑翔机 "网格。我们可以在以下一行看到这一点
main :: IO ()
main = life glider
- 尝试切换到另一个定义的网格。
- 在屏幕上用什么字符来表示活细胞?试着把它改成一个你选择的字符。
- 尝试添加一个你自己的网格。一些有趣的例子可以在维基百科的生命游戏页面上找到。
制作和解释 Haskell 源代码模块
- 在你选择的目录中建立一个名为
foo.hs
的新文件。你可以用终端或文件浏览器来做。 - 添加以下内容:
double :: Int -> Int
double x = x + x
- 打开一个新的终端窗口。
- 运行
ghci
来启动 Haskell 解释器。 - 加载新的文件,如下所示。
Prelude> :l foo.hs
[1 of 1] Compiling Main ( foo.hs, interpreted )
Ok, one module loaded.
- 用你喜欢的数字运行函数
double
*Main> double 6
检查 Ghci 中的一些类型
使用 ghci
找出下列表达式的类型
not (not (not False))
(True,False)
(see Section 3.4 of Programming in Haskell)['a', 'b', 'x']
(see Section 3.3 of Programming in Haskell)[(3,4),(4,6)]
(++)
(What is strange about this type? See "polymorphic functions" discussed later.)
Ill-typed Expressions 错误类型的表达式
- 用 Haskell 写出 5 个 ill-typed expressions
- 在
ghci
中检查它们的类型 -ghci
怎么说? - 当你试图评估该表达式时会发生什么?