此表达式的类型为 '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
我在 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