请参阅代码示例中的ocaml类型

时间:2017-06-25 03:26:45

标签: ocaml

这可能是一个基本的ocaml类型问题。请解释我如何从ocaml toplevel获取以下代码类型为('a * 'a) list -> 'a list

let rec func lst = match lst with
|[] -> []
|h::t -> match h with
|(a,b) -> if (a = b) then a::(func t) else b::(func t);;

1 个答案:

答案 0 :(得分:4)

让我们一个接一个地检查代码的类型。在第一行,代码中的func表示函数的名称,而lst是元组列表,因为我们使用与lst匹配并得到[]->[](a,b)->而我们有一个= b(a和b有相同的类型,我忘了提之前感谢你指出),所以('a*'a) list。现在,让我们检查func函数的输出。在第四行,它递归调用func本身,其返回值是一个列表,因为根据::的定义,x是一个值,y是一个列表x::y。因为ocaml中的列表是同构的,所以列表的类型与值a相同。值a的类型为'a,因为a值来自(a,b)。因此,它具有类型('a * 'a) list -> 'a list