在OCaml中,可以在记录中定义显式多态类型
type foo = { f : 'a. unit -> 'a };;
似乎我们只能将一般值分配给f
,如
{ f = fun () -> failwith ""; }
或
{ f = fun () -> exit 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