在Ocaml中是否可以使用多个类型的参数?
我定义了两种不同的类型,并且这两种类型都有一个地址字段:
type symbol =
{
address : string;
name : string;
}
type extern_symbol =
{
address : string;
name : string;
...
}
我还有一个函数,该函数以符号列表作为参数,并使用 address 字段进行检查。现在,我想为 extern_symbol列表重用该函数的代码。该功能与其他列表完全相同。有没有一种方法可以完成而不必编写重复的代码?
答案 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; ... }