记录中的显式多态类型

时间:2014-04-27 08:16:04

标签: ocaml

在OCaml中,可以在记录中定义显式多态类型

type foo = { f : 'a. unit -> 'a };;

似乎我们只能将一般值分配给f,如

{ f = fun () -> failwith ""; }

{ f = fun () -> exit 1; }

如何在现实世界中使用此语言功能?有没有好的实际例子?

1 个答案:

答案 0 :(得分:5)

这与记录无关。如果声明任何函数具有类型'a. unit -> 'a(不接受任何内容并返回调用者想要的内容),那么您只能将它用于不返回的函数。

这是一个稍微有用的示例:包含用于查找列表长度(任何类型)的函数的记录。

# type foo = { f : 'a. 'a list -> int };;
type foo = { f : 'a. 'a list -> int; }

# let foo = { f = List.length };;
val foo : foo = {f = <fun>}
# foo.f [1;2;3];;
- : int = 3

如果您想将List.length之类的函数作为参数传递给另一个函数,并将其用于多种类型,那么它会非常有用:

假设我们想将List.length传递给test。我们不能直接这样做:

# let test fn = fn [1;2;3] + fn ["a";"b";"c"];;
Error: This expression has type string but an expression was expected of type
         int

但我们可以使用记录:

# let test foo = foo.f [1;2;3] + foo.f ["a";"b";"c"];;
val test : foo -> int = <fun>

# test foo;;
- : int = 6
相关问题