使用递归累积列表时键入错误

时间:2016-09-10 12:12:04

标签: recursion types compiler-errors ocaml accumulate

字典是对的列表。任务是获取字典并返回一对列表:键和值。

我尝试在字典上迭代(使用递归)并在两个列表中累积键和值,但是我得到了一个令我困惑的类型错误。

注意:我 NOT 正在寻找该任务的替代解决方案。我想了解错误以及如何纠正错误。

以下是代码:

let lists_of_dict dict =
  let rec separate dict keys values =
    match dict with
      [] -> (keys, values)
    | (k, v)::t -> separate t k::keys v::values
                (* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *)
  in
  separate dict [] []

(带下划线的部分是第5行的字符19-47)

以下是错误消息:

File "lod-problem.ml", line 5, characters 19-47:
Error: This expression has type 'a list
       but an expression was expected of type 'b * 'c

我无法理解为什么Ocaml会推断出这种类型,以及如何让它理解表达式的类型为('a list * 'b list)(如果我没有弄错的话)。

1 个答案:

答案 0 :(得分:1)

separate t k::keys v::values按您的意图解析为(separate t k) :: (keys v) :: values,而不是separate t (k::keys) (v::values)

所以OCaml看到你使用::构建结果,因此结果将成为一个列表(更不用说::的参数也有错误的类型 - 类型检查器从来没有那么远),但预期的结果是一个元组(因为这是第一个案例产生的)。所以此时类型检查器出错了。