1

我正在阅读这个关于 Caml 类型的wiki,我必须承认我很难理解如何在语法上处理多态类型,所以一般来说,如何定义多态类型?

4

1 回答 1

3

多态性出现在 OCaml 中的很多地方。该 wiki 上讨论的多态类型只是参数化类型。在某种意义上,它们是类型级别的函数。要定义单参数类型:

type 'a <name> = <definition using 'a>

例如

type 'a tagged = { value: 'a; tag: int }

在该<definition>部分中,您使用类型名称 ( 'a) 作为形式参数,代表稍后提供的任何具体类型。

声明类型(声明valuetag作为记录字段)后,您可以创建该类型的值:

# { value = "abc"; tag = 4 };;
- : string tagged = {value = "abc"; tag = 4}

编译器推断该值的类型是string tagged因为该value字段具有 type string

使用括号将类型参数括起来定义多个参数类型:

type ('a, 'b) name = <definition using 'a and 'b>

例如:

type ('a, 'b) paired = { first: 'a; second: 'b }

这定义了字段名称firstsecond,然后您可以使用它们来生成值:

# { first = 1.5; second = [3] };;
- : (float, int list) paired = {first = 1.5; second = [3]}

总而言之,创建多态(参数化)类型的语法与创建类型的语法相同,并通过使用'a类型参数等符号进行了扩展。

于 2013-09-20T17:45:11.473 回答