我正在阅读这个关于Caml类型的维基,我必须承认我正在努力理解多态类型是如何在语法上处理的,所以一般来说如何定义多态类型?
多态性出现在OCaml的许多地方。该 wiki 上讨论的多态类型只是参数化类型。从某种意义上说,它们是类型级函数。定义单参数类型:
type 'a <name> = <definition using 'a>
例如
type 'a tagged = { value: 'a; tag: int }
在<definition>
部分中,您使用类型名称('a
)作为代表稍后提供的任何具体类型的形式参数。
声明类型(将value
和tag
声明为记录字段)后,可以创建以下类型的值:
# { value = "abc"; tag = 4 };;
- : string tagged = {value = "abc"; tag = 4}
编译器推断此值的类型string tagged
,因为value
字段的类型为 string
。
使用括号定义多个参数类型,以将类型参数括起来:
type ('a, 'b) name = <definition using 'a and 'b>
例如:
type ('a, 'b) paired = { first: 'a; second: 'b }
这定义了字段名称first
和second
,然后您可以使用它们来生成值:
# { first = 1.5; second = [3] };;
- : (float, int list) paired = {first = 1.5; second = [3]}
总而言之,创建多态(参数化)类型的语法与创建类型的语法相同,通过对类型参数使用符号(如 'a
)进行扩展。