多态类型:如何?

时间:2013-09-20 17:34:24

标签: functional-programming ocaml caml

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

1 个答案:

答案 0 :(得分: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字段的类型为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之类的符号进行扩展。