另一个 Haskell 教程/入门
Haskell | |
---|---|
另一个 Haskell 教程 | |
前言 | |
介绍 | |
入门 | |
语言基础 (解决方案) | |
类型基础 (解决方案) | |
IO (解决方案) | |
模块 (解决方案) | |
高级语言 (解决方案) | |
高级类型 (解决方案) | |
单子 (解决方案) | |
高级 IO | |
递归 | |
复杂度 | |
有三个众所周知 Haskell 系统:Hugs、GHC 和 NHC。Hugs 仅限于解释器,这意味着你无法用它编译独立程序,但可以在交互式环境中测试和调试程序。GHC 既是解释器(如 Hugs),也是编译器,它会生成独立程序。NHC 仅限于编译器。你使用哪一个完全取决于你自己。我试图在下面的列表中列出一些区别,但这当然远非详尽无遗。
- Hugs - 加载文件非常快,运行速度很慢;实现了几乎所有 Haskell 98(标准)和大多数扩展;内置模块浏览支持;无法创建独立程序;用 C 编写;几乎可以在所有平台上运行;内置图形库。
- GHC - 交互式环境比 Hugs 加载速度慢,但允许在环境中定义函数(在 Hugs 中,你必须将它们放到文件中);实现了所有 Haskell 98 和扩展;对与其他语言接口有很好的支持;在某种意义上是“事实上的”标准。它还允许加载和测试已编译的对象。
- NHC - 使用较少,没有交互式环境,但与 GHC 相比,它生成更小且通常更快的可执行文件;支持 Haskell98 和一些扩展。
我个人安装了所有这些,并将其用于不同的目的。我倾向于使用 GHC 编译(主要是因为我最熟悉它),使用 Hugs 交互式环境,因为它速度快得多。因此,这就是我建议的。然而,要下载和安装这么多东西需要花不少时间,因此,如果你只需要一个,我建议你选择 GHC,因为它既包含编译器又包含交互式环境。
以下是截至本教程编写之时如何下载和安装这些系统中的每一个的说明。它可能已经改变了——请参阅 Haskell 网站 获取最新信息。
Hugs 支持几乎所有 Haskell 98 标准(它缺少一些库),以及许多高级/实验性扩展,包括:多参数类型类、可扩展记录、rank-2 多态性、存在量词、作用域类型变量和受限类型同义词。
Hugs 的官方网页位于 [1]。
如果你访问该网页,会看到一个名为“下载”的链接,点击它会将你带到下载页面。从该页面,你可以下载适用于你的电脑的 Hugs 版本。
下载 Hugs 后,安装方式因平台而异,但 Hugs 的安装与你平台上任何程序的安装方式几乎相同。
- 对于 Windows,当点击下载的“msi”文件时,
只需选择“运行此程序”,安装将自动开始。然后,只需按照屏幕上的说明进行操作。
- 对于 RPM,使用你最熟悉的任何 RPM 安装程序。
- 对于源代码,首先解压缩文件,然后解压它。如果你使用的是不受支持的系统,那么你应该了解你的系统,能够运行配置脚本并手动进行操作。
在 Unix 机器上,Hugs 解释器通常使用以下形式的命令行启动:hugs [选项 | 文件] ...
在 Windows 上,Hugs 可以通过从开始菜单中选择它或双击扩展名为 .hs 或 .lhs 的文件来启动。(本手册假设 Hugs 已经成功安装在你的系统上。)
Hugs 使用选项来设置系统参数。这些选项以开头的 + 或 - 表示,用于自定义解释器的行为。Hugs 启动时,解释器执行以下任务
- 处理环境中的选项。变量 HUGSFLAGS 包含这些选项。在 Windows 95/NT 上,也会查询注册表以获取 Hugs 选项设置。
- 处理命令行选项。
- 初始化内部数据结构。特别是,堆会在此时初始化,并且它的大小在此处固定;如果你想以默认堆大小以外的大小运行解释器,那么必须使用命令行、环境或注册表中的选项指定此大小。
- 加载序言文件。解释器将在由 -P 选项指定的路径上查找序言文件。如果序言(位于 Prelude.hs 文件中)在路径目录中的任何位置或当前目录中都找不到,则 Hugs 将终止;Hugs 无法在没有序言文件的情况下运行。
- 加载命令行上指定的程序文件。hugs f1 ... fn 命令的效果与使用 hugs 命令启动 Hugs 然后键入 :load f1 ... fn 相同。特别是,如果在尝试加载指定文件之一时出现问题,解释器不会终止,但会中止尝试加载命令。
Hugs 使用的环境变量和命令行选项在以下部分中描述。
列出所有选项会占用太多空间。目前最重要的选项是 “+98” 或 “-98”。当你使用 “+98” 启动 Hugs 时,它处于 Haskell 98 模式,会关闭所有扩展。当你使用 “-98” 启动时,你处于 Hugs 模式,所有扩展都被打开。如果你下载了别人的代码并且加载时遇到了麻烦,首先要确保你设置了正确的 “98” 标志。
有关 Hugs 选项的更多信息,请参阅手册:http://cvs.haskell.org/Hugs/pages/hugsman/started.html
要获得 Hugs 特定的帮助,请访问 Hugs 网站。要获得通用的 Haskell 帮助,请访问 Haskell 网站。
Glasgow Haskell 编译器 (GHC) 是一个健壮的、功能齐全的、优化编译器和交互式环境,适用于 Haskell 98;GHC 将 Haskell 编译为本地代码或 C 代码。它实现了 Haskell 98 的许多实验性语言扩展;例如:并发、外部语言接口、多参数类型类、作用域类型变量、存在量化和全称量化、非盒装类型、异常、弱指针等等。GHC 配备了分代垃圾收集器和一个空间和时间剖析器。
访问 GHC 的官方网站 GHC 下载最新版本。编写本教程时的当前版本为 5.04.2,可以从 GHC 下载页面下载(点击 “Download” 链接)。从该页面,你可以下载适用于你的计算机的 GHC 的相应版本。
下载 GHC 后,安装方式会因平台而异;但是,GHC 的安装方式与你平台上的任何程序的安装方式大体相同。
- 对于 Windows,当你点击下载的 “msi” 文件时,只需选择 “运行此程序”,安装会自动开始。接下来,只需按照屏幕上的说明进行操作。
- 对于 RPM,使用你最熟悉的任何 RPM 安装程序。
- 对于源代码,首先解压缩文件,然后解压它。如果你使用的是不受支持的系统,那么你应该了解你的系统,能够运行配置脚本并手动进行操作。
有关安装过程的更详细说明,请查看 GHC 用户手册中的 “安装 GHC” 部分。
运行编译器非常容易。假设你有一个用 `main` 函数编写的程序,该程序存储在一个名为Main.hs的文件中,你可以通过编写以下命令来编译它:
示例
% ghc --make Main.hs -o main
“--make” 选项告诉 GHC 这是一个程序,而不仅仅是一个库,你想要构建它以及它依赖的所有模块。“Main.hs” 指定要编译的文件名;而 “-o main” 表示你想要将输出放到一个名为 “main” 的文件中。
注意
在 Windows 中,你应该使用 “-o main.exe” 来告诉 Windows 这是一个可执行文件。
然后,你只需在提示符下键入 “./main” 即可运行程序。
GHCi 通过命令 “ghci” 或 “ghc --interactive” 启动。你也可以在命令行中指定一个或多个模块或文件名;这会指示 GHCi 加载指定的模块或文件名(以及它们依赖的所有模块),就像你在 GHCi 提示符下输入 :load modules 一样。
要在解释器中获得帮助,请在提示符下键入 “:?”。要退出,请键入 “:q”。要中断正在运行的计算,请按 Ctrl+C。
列出所有选项会占用太多空间。目前最重要的选项是 “-fglasgow-exts”。当你使用 “-fglasgow-exts” 启动 GHCi 时,它处于 Haskell 98 模式,会关闭所有扩展。当你使用 “-fglasgow-exts” 启动时,所有扩展都被打开。如果你下载了别人的代码并且加载时遇到了麻烦,首先要确保你设置了正确的标志。
有关 GHC 和 GHCi 选项的更多信息,请参阅 GHC 网站上的手册。
要获得 GHC(i) 特定的帮助,请访问 GHC 网站。要获得通用的 Haskell 帮助,请访问 Haskell 网站。
关于 NHC…
使用一个好的文本编辑器,编程会变得很有趣。当然,你可以使用一个简单的编辑器,它只支持剪切粘贴,但一个好的编辑器可以为你处理大部分琐碎的工作,让你可以专注于你正在编写的内容。在 Haskell 编程方面,一个好的文本编辑器应该尽可能多地包含以下功能:
- 源文件的语法高亮
- 源文件的缩进
- 与 Haskell 解释器(无论是 Hugs 还是 GHCi)交互
- 计算机辅助代码导航
- 代码自动完成
在编写本文时,有多种选择可用:Emacs/XEmacs 通过 `haskell-mode` 和配套的 Elisp 代码(可从 [2] 获取)支持 Haskell,以及… %todo: 其他还有哪些?
还有哪些可用?…
(X)Emacs 似乎做得最好,它包含了上面列出的所有功能。缩进功能能够识别 Haskell 的二维布局规则(请参阅有关 布局 的部分),非常智能,必须亲眼看到才能相信。借助 “Definitions” 菜单,你可以快速跳转到选定函数的定义,当前编辑的函数名称始终显示在模式行中。%todo: 还有其他功能吗?