了解以下函数的类型

时间:2019-04-29 02:08:51

标签: types ocaml

我在OCaml中编写了merge_sorted函数,该函数具有一个比较函数和两个排序列表并将它们合并在一起。我试图了解为什么此函数的类型是

('a -> 'a -> bool) -> 'a list -> 'a list -> 'a list

而不是

('a -> 'a -> bool) -> 'a list

因为它只返回一个列表。下面是我的merge_sorted函数的代码

let rec merge_sorted lt a b = 
    match a with 
    | [] -> b
    | h::t -> match b with
            | []-> a 
            | hh::tt -> if (lt h hh) 
                        then h::merge_sorted lt t b 
                        else hh::merge_sorted lt a tt;;

1 个答案:

答案 0 :(得分:2)

该函数接受三个类型为'a -> 'a -> bool'a list'a list的参数。它返回类型为'a list的值。函数的类型(当以您喜欢的形式定义时)由参数类型组成,以->分隔,后跟返回类型。

因此类型实际上是('a -> 'a -> bool) -> 'a list -> 'a list -> 'a list。前两个'a list是第二和第三自变量类型。最后一个'a list是返回类型。

这不仅是一种符号约定。您的函数实际上接受比较函数(类型为'a -> 'a -> bool),并返回两个参数的函数。返回的函数接受列表(类型为'a list)并返回一个函数。依此类推。