跳转至内容

另一个 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 标准(它缺少一些库),以及许多高级/实验性扩展,包括:多参数类型类、可扩展记录、秩 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 Compiler

[编辑 | 编辑源代码]

Glasgow Haskell Compiler (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.hs的文件中包含 main 函数的程序,您可以通过编写以下命令来编译它:

示例

% 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 模块一样。

要在解释器内获得帮助,请在提示符下键入“:?”。要退出,请键入“: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 代码支持 Haskell(可从 [2] 获取),以及...。%todo: 还有其他什么?

还有哪些可用?...

(X)Emacs 似乎做得最好,拥有所有上面列出的功能。缩进功能了解 Haskell 的二维布局规则(参见有关布局 的部分),非常智能,只有亲眼看到才能相信。您可以借助“Definitions”菜单快速跳转到所选函数的定义,并且当前正在编辑的函数名称始终会显示在模式行中。%todo: 更多?


华夏公益教科书