此表达式具有类型'列表,但表达式需要类型' a

时间:2017-10-19 07:54:02

标签: list ocaml typeerror cons

我在OCaml中有一个函数,它应该合并两个列表:

let rec merge (list1, list2) = 
    match (list1, list2) with
        ([], []) -> merge (List.tl list1, List.tl list2) :: List.hd list1 :: List.hd list2
        |(_, []) -> merge (List.tl list1, list2) :: List.hd list1
        |([], _) -> merge (list1, List.tl list2) :: List.hd list2;;

但由于某种原因,编译器不会让这段代码通过以下方式退出:

  

错误:此表达式具有类型'列表   但是预期表达类型为a   类型变量' a出现在列表

如何指定这些是我尝试通过的列表,而不是' a?

1 个答案:

答案 0 :(得分:2)

首先,这个功能不起作用。如果两个列表都是空的,你合并尾部并连接每个列表的头部,但是......好吧......它们都是空的......

无论如何,您的问题是您正在使用类型为::的{​​{1}}运算符(串联),因此左侧成员应为元素,右侧成员为列表,此处为左边一个是列表,右边一个是元素,所以它无法工作。

关于您的问题,由于推断出类型,您无法告诉编译器您是对的,而且他是错的,在这种情况下错误是真的明确:

'a -> 'a list -> 'a list

将始终返回错误,因为您有一个无限类型(因为 List.tl l (* 'a list *) :: List.hd l (* 'a *) 类型为::,我让您尝试确定可以与您的串联匹配的有限类型'a -> 'a list -> 'a list

所以,我想你想做的是这样的事情:

'a