我在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;;
答案 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
)并返回一个函数。依此类推。