使用递归累加列表时出现类型错误



字典是一对的列表。任务是接受一个字典并返回一对列表:键和值。

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

注意:我不是寻找任务的替代解决方案。我想了解这个错误以及如何纠正它

代码如下:

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)(如果我没弄错的话)。

separate t k::keys v::values解析为(separate t k) :: (keys v) :: values,而不是您想要的separate t (k::keys) (v::values)

因此OCaml看到您使用::构建结果,因此结果将是一个列表(不要介意::的参数也具有错误类型的事实-类型检查器永远不会得到那么远),但预期的结果是一个元组(因为这是第一种情况产生的)。这时,类型检查器就出错了

相关内容

最新更新