这可能是一个基本的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);;
答案 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
。