这是关于 OCaml 中的类型定义,我发现以下语法令人费解:
type 'a t
在简单的英语中是什么意思?
最佳答案
由于 OP 有 C++ 语言的经验,我认为以下解释可能有用。形式的类型声明:
type 'a t
接近C++template <typename a> class t;
例如,'a list
是一个通用列表,'a
是元素的一种类型。为简洁起见,我们使用单个 '
, 而不是 template <typename _>
构造。在 OCaml 的说法中,我们使用术语“参数多态性”,而不是“泛型编程”。我们说的是类型构造函数,而不是单词模板。后者有一个有趣的结果。就像在 C++ 中模板实例化创建类型的新实例一样,在 OCaml 中,协调多态类型的类型变量会创建新类型,例如 int list
, float list
(参见,list<int>
,float<list>
)。因此,可以查看类型构造函数 'a list
作为类型级别的一元函数,它接受一个类型并创建一个类型。可以有 nary 类型的构造函数,例如 type ('key, 'value) hashtbl
是一个二进制类型构造函数,它为给定的 key
创建一个类型和 value
一对。此外,我们可以将非参数类型视为空类型构造函数,因此 int
构造类型 int
.附言F# 语言,OCaml 的后代,允许以两种形式编写:
int t
和 t<int>
附言为了防止可能的混淆,我想声明,尽管模板和参数类型试图解决相同的问题,但它们仍然存在一些差异。模板在实例化之后键入,参数类型在之前。所以参数类型'a t
为所有 'a
定义.如果你想创建一个类型变量没有被普遍量化的类型,你可以使用另一种机制——仿函数。它们也非常接近模板,但它们接受类型加类型要求,这是 C++ 术语中的一个概念。这些概念在 OCaml 中的模块类型中被具体化,因此仿函数实际上是模块级别的函数,因为它接受一个模块并产生一个模块。
关于OCaml 语法 : what does type 'a t mean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36974203/