使用递归累积列表时类型错误
Type error when using recursion accumulating lists
字典是对的列表。任务是获取字典和 return 一对列表:键和值。
我尝试在字典上迭代(使用递归)并在两个列表中累积键和值,但我遇到了一个令我困惑的类型错误。
注意:我不是寻找任务的替代解决方案。我想了解错误以及如何更正错误。
代码如下:
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 看到您使用 ::
构建结果,因此结果将是一个列表(不要介意 ::
的参数也有错误的类型 -类型检查器永远不会走那么远),但预期的结果是一个元组(因为这是第一个案例产生的结果)。所以在那个时候类型检查器出错了。
字典是对的列表。任务是获取字典和 return 一对列表:键和值。
我尝试在字典上迭代(使用递归)并在两个列表中累积键和值,但我遇到了一个令我困惑的类型错误。
注意:我不是寻找任务的替代解决方案。我想了解错误以及如何更正错误。
代码如下:
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 看到您使用 ::
构建结果,因此结果将是一个列表(不要介意 ::
的参数也有错误的类型 -类型检查器永远不会走那么远),但预期的结果是一个元组(因为这是第一个案例产生的结果)。所以在那个时候类型检查器出错了。