OCAML:具有多种类型的参数

时间:2020-07-20 12:17:23

标签: types ocaml reusability

在Ocaml中是否可以使用多个类型的参数?

我定义了两种不同的类型,并且这两种类型都有一个地址字段:

type symbol =
  {
    address : string;
    name : string;
  }


type extern_symbol =
  {
    address : string;
    name : string;
    ...
  }

我还有一个函数,该函数以符号列表作为参数,并使用 address 字段进行检查。现在,我想为 extern_symbol列表重用该函数的代码。该功能与其他列表完全相同。有没有一种方法可以完成而不必编写重复的代码?

1 个答案:

答案 0 :(得分:4)

您不能直接使用记录参数来执行此操作,因为所有记录类型都是不同的。 “任何具有名为address的字符串类型的字段的记录”的概念没有类型。因此,您不能具有该类型的参数。

当然,只要您需要,就可以将地址传递给函数,而不是整个记录。

或者您可以传递提取地址的函数:

let myfun address_of r =
    do_what_you_want (address_of r)

let internal_addr (r: symbol) = r.address
let external_addr (r: extern_symbol) = r.address

myfun internal_addr r1
myfun external_addr r2

因此myfun的类型如下:

(a -> string) -> a -> result

这概括了可应用于两种记录类型的其他操作。

您还可以使用对象类型而不是记录。 的类型为

address

例如:

< address : string; .. >

最后,您可以将两种类型设为同一类型的不同变体:

# let myfun2 ob = do_what_i_wanted ob#address;;
val myfun2 : < address : string; .. > -> string = <fun>

那么用相同的功能处理它们就不会有问题:

type symbol =
   | Internal of { address: string; name: string }
   | External of { address: string; name: string; ... }