此表达式的类型为 'a 列表,但表达式应为 'a 类型

This expression has type 'a list but an expression was expected of type 'a

我在 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;;

但出于某种原因,编译器不允许此代码退出:

Error: This expression has type 'a list but an expression was expected of type 'a The type variable 'a occurs inside 'a list

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

首先,这个功能是行不通的。如果两个列表为空,则合并尾部并连接每个列表的头部,但是......好吧......它们是空的......

无论如何,你的问题是你正在使用类型为 'a -> 'a list -> 'a list:: 运算符(串联),所以左边的成员应该是一个元素,右边的应该是一个列表,这里是左边一个是列表,右边一个是元素,所以它不能工作。

关于你的问题,由于类型是推断出来的,你不能告诉编译器你是对的他是错的,在这种情况下错误是真正明确的:

 List.tl l (* 'a list *) :: List.hd l (* 'a *)

总是 return 一个错误,因为你有一个无限类型(因为 ::'a -> 'a list -> 'a list 类型,我让你尝试确定一个有限类型 'a可以与您的串联相匹配)

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

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