引言

在传统编程语言中,类型 之间有明确的区分。例如在 Haskell 中, 下面这些类型分别表示整数、字符、字符列表 以及任意值的列表:

  • Int, Char, [Char], [a]

与此对应,下面这些值分别为上述类型的成员:

  • 42, ’a’, "Hello world!", [2,3,4,5,6]

然而,在带有 依赖类型(Dependent Type) 的语言中,它们的区别并不明显。 依赖类型允许类型「依赖」于值,换句话说,类型是 一等(First-Class) 的语言构造, 即它可以像值一样进行操作。标准范例就是带长度的列表类型 [1] Vect n a, 其中 a 为元素的类型,而 n 为该列表的长度且可以任意长。

当类型包含了描述其性质的值(如列表的长度)时,它就能描述函数自身的性质了。 比如连接两个列表的操作,它拥有性质:结果列表的长度为两个输入列表的长度之和。 因此我们可以为 app 函数赋予如下类型,它用于连接向量(Vector):

app : Vect n a -> Vect m a -> Vect (n + m) a

本教程介绍了 Idris,一个通用的依赖类型函数式编程语言。Idris 项目旨在为可验证的通用编程打造一个依赖类型的语言。 为此,Idris 被设计成了编译型语言,目的在于生成高效的可执行代码。 它还拥有轻量的外部函数接口,可与外部 C 库轻松交互。

目标受众

本教程面向已经熟悉函数式语言(如 HaskellOCaml )的读者,旨在简要地介绍该语言。 尽管大多数概念都会有简单的解释,读者仍须熟悉 Haskell 的语法。 我们亦假设读者有兴趣使用依赖类型来编写和验证系统软件。

对 Idris 更加深入的介绍,见 Edwin Brady 所著的《 Idris 类型驱动开发 》, 其进度要慢得多,涵盖了交互式程序开发以及更多的例子。本书可从 Manning 获取。

示例代码

本教程中的示例代码通过了 Idris 的测试。这些文件可在 Idris 发行版的 samples 目录中找到,因此您可以轻松使用它们。然而,我们强烈建议您不要只是载入后阅读, 而是亲自输入它们。

[1]也许会令人困惑,它在依赖类型编程的文献中通常被称作「向量 (Vector) 」。